我想压缩两个DenseVectors
并对每一对执行操作,并获得一个新的向量作为结果。使用scala-breeze实现这一目标的最佳方法是什么?
我可以使用他们的data
字段来处理它,但我需要从结果数组中构造一个新的DenseVector
。
答案 0 :(得分:3)
我应该在DenseVector上制作一个方法,但是
breeze.linalg.zipValues(dv1, dv2){(v1, v2) => ??? }
应该这样做。
答案 1 :(得分:0)
接受的答案似乎无法正常工作。考虑以下示例,尝试将两个DenseVector
值转换为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) => ... }