我實作了以下代碼來使用 for 回圈計算加權平均,我怎樣才能更 func 編程風格并使用mapand zip?
val aggAvg = (emb: Seq[Seq[Float]], weights: Seq[Float]) => {
val embSize = emb.head.size
val len = emb.size
(0 until embSize)
.map { i =>
(0 until len).map { j =>
emb(j)(i) * weights(j)
}.sum / weights.sum
}
}
示例:給定
val emb: Seq[Seq[Float]] = Seq(Seq(1,2,3), Seq(4,5,6))
val weights: Seq[Float] = Seq(2, 8)
輸出將是Seq(3.4, 4.4, 5.4)因為
(1 * 2 4 * 8) / (2 8) = 3.4等等。
uj5u.com熱心網友回復:
這是一種方式,雖然我不確定它是否是最優雅的
val aggAvg = (emb: Seq[Seq[Float]], weights: Seq[Float]) =>
emb.transpose.map((weights, _).zipped.map(_ * _).sum).map(_ / weights.sum)
res0: Seq[Float] = List(3.4, 4.4, 5.4)
uj5u.com熱心網友回復:
這使用一個Iterator代替zip操作。
val aggAvg = (emb: Seq[Seq[Float]], weights: Seq[Float]) => {
val wtItr = weights.iterator
val wtSum = weights.sum
emb.map(_.map(wtItr.next().*)).transpose.map(_.sum/wtSum)
}
注意:如果不是所有的行長度都與長度匹配,這可能有點危險weights,但是你發布的aggAvg代碼在這個 reguard 中是相同的,所以我省略了安全檢查。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327816.html
上一篇:sbt無法匯入apache庫
下一篇:獲取Akkaask的目標/接收者
