2013-02-14 31 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不允許隱式廣播,除了標量類型。