2013-02-14 79 views
2

是否有使用微风来实现,你可以在与NumPy利用广播做一个通用的方法是什么?使用Scala的微风做numpy的风格广播

具体地,如果我有一个操作者我想应用到2×4矩阵,我可以应用操作逐元素。但是,我所拥有的是一个3x4矩阵和一个3元素列向量。我想要一个函数,它生成一个3x4矩阵,该矩阵是通过将矩阵的每个元素与相应行的向量中的元素应用到算子而创建的。

因此,对于一个部门:

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

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

回答

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 

我敢肯定,你可以适应你从简单的“加法”想要什么上面。

+0

谢谢,是的,这是一种有用的方式来完成我需要做的一类事情。有没有任何地方的Breeze文件。例如,当我在Scaladoc中查找mapPairs时,它只是说“创建一个包含此映射的转换副本的新地图”?看起来像一个非常强大的图书馆,但很难进入没有任何文档。 – 2013-02-14 22:28:50

+1

我希望有更多的文档。我主要通过使用REPL来学习功能。该库遵循一个通用的模式,似乎在像CanBuildFrom这样的接口的scala中或者在这种情况下是CanMapKeyValuePairs。例如,mapPairs是TensorLike特征的一部分,所以你也可以在其他对象中看到它。 – Noah 2013-02-15 14:22:36

1

微风现在支持这种类型的广播:

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不允许隐式广播,除了标量类型。