3

是否有使用 Breeze 的通用方法来实现在 NumPy 中使用广播可以做的事情?

具体来说,如果我想将一个运算符应用于两个 3x4 矩阵,我可以按元素应用该运算符。但是,我拥有的是一个 3x4 矩阵和一个 3 元素列向量。我想要一个函数,它产生一个 3x4 矩阵,该矩阵是通过将运算符应用于矩阵的每个元素以及对应行的向量中的元素而创建的。

所以对于一个部门:

2 4 6   /  2 3  = 1 2 3
3 6 9             1 2 3

如果这不可用。我愿意考虑实施它。

4

2 回答 2

3

您可以使用 mapPairs 来实现我“认为”您正在寻找的东西:

  val adder = DenseVector(1, 2, 3, 4)

  val result = DenseMatrix.zeros[Int](3, 4).mapPairs({
    case ((row, col), value) => {
      value + adder(col)
    }
  })

  println(result)

1  2  3  4  
1  2  3  4  
1  2  3  4  

我相信您可以从上面的简单“加法器”中调整您想要的内容。

于 2013-02-14T22:20:35.823 回答
3

Breeze 现在支持这种广播:

scala> val dm = DenseMatrix( (2, 4, 6), (3, 6, 9) )
dm: breeze.linalg.DenseMatrix[Int] = 
2  4  6  
3  6  9  

scala> val dv = DenseVector(2,3)
dv: breeze.linalg.DenseVector[Int] = DenseVector(2, 3)

scala> dm(::, *) :/ dv
res4: breeze.linalg.DenseMatrix[Int] = 
1  2  3  
1  2  3  

*操作员说要沿哪个轴广播。Breeze 不允许隐式广播,但标量类型除外。

于 2014-01-24T01:48:48.363 回答