scala - 在 2 个 for 循环中使用 map 和 zip 使其更具功能性

标签 scala functional-programming

我实现了以下代码来使用 for 循环计算加权平均值,我怎样才能更 func 编程风格并使用 mapzip

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 等等。

最佳答案

这是一种方式,虽然我不确定它是否是最优雅的

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)

关于scala - 在 2 个 for 循环中使用 map 和 zip 使其更具功能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69623371/

相关文章:

scala - 忽略 future 的理解失败

java - 映射字符串列表?

haskell - 单子(monad)可以被视为计算(或计算过程)的具体化吗?

templates - 如何使用 C++ 模板传递函数及其签名(haskell 样式)?

scala - 在Scala中,如何在满足条件后立即停止从文件中读取行?

scala - 反汇编 Scala 代码

algorithm - Scala 代码中的性能问题 - O(nlgn) 比 O(n) 快

R : How evaluate formals (arguments) of function?

scala - Actor 与 ExecutionContext 的理解

scala - 为什么String文字符合Scala Singleton