我想压缩两个DenseVectors
并对每一对执行操作,并获得一个新的向量作为结果。使用 scala-breeze 实现这一目标的最佳方法是什么?
我可以通过使用他们的字段来解决它data
,但我需要DenseVector
从结果数组中构造一个新的。
我想压缩两个DenseVectors
并对每一对执行操作,并获得一个新的向量作为结果。使用 scala-breeze 实现这一目标的最佳方法是什么?
我可以通过使用他们的字段来解决它data
,但我需要DenseVector
从结果数组中构造一个新的。
我可能应该只在 DenseVector 上创建一个方法,但是
breeze.linalg.zipValues(dv1, dv2){(v1, v2) => ??? }
应该这样做。
接受的答案似乎没有按预期工作。考虑这个例子,尝试将两个DenseVector
值转换为 a Map[String -> Double]
,每个原始输入都有一个名称。
scala> val dv1 = DenseVector.zeros[Double](4)
dv1: breeze.linalg.DenseVector[Double] = DenseVector(0.0, 0.0, 0.0, 0.0)
scala> val dv2 = DenseVector.ones[Double](4)
dv2: breeze.linalg.DenseVector[Double] = DenseVector(1.0, 1.0, 1.0, 1.0)
scala> breeze.linalg.zipValues(dv1, dv2) {(v1, v2) => Map("f1" -> v1, "f2" -> v2)}
res710: scala.collection.immutable.Map[String,breeze.linalg.DenseVector[Double]] = Map(f1 -> DenseVector(0.0, 0.0, 0.0, 0.0), f2 -> DenseVector(1.0, 1.0, 1.0, 1.0))
scala> (dv1.toScalaVector zip dv2.toScalaVector) map { case (v1, v2) => Map("f1" -> v1, "f2" -> v2)}
res711: scala.collection.immutable.Vector[scala.collection.immutable.Map[String,Double]] = Vector(Map(f1 -> 0.0, f2 -> 1.0), Map(f1 -> 0.0, f2 -> 1.0), Map(f1 -> 0.0, f2 -> 1.0), Map(f1 -> 0.0, f2 -> 1.0))
请注意,使用如何breeze.linalg.zipValues
将映射函数视为每个整体的函数DenseVector
,因此输出是单个Map
而不是Map
输入的每个组件的输出(如第二个示例中所示)。
尽管效率低下(对于微风的限制,这是一个不幸的解决方法),但我上面给出的最后一行通常应该有效:
(dv1.toScalaVector zip dv2.toScalaVector) map { case (v1, v2) => ... }