【问题标题】:Using Scala Breeze to do numPy style broadcasting使用 Scala Breeze 做 numPy 风格的广播
【发布时间】:2013-01-30 16:15:52
【问题描述】:

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

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

所以对于一个部门:

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

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

【问题讨论】:

    标签: scala scalala scala-breeze


    【解决方案1】:

    您可以使用 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  
    

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

    【讨论】:

    • 谢谢,是的,这是完成我需要做的一类事情的有用方法。是否有任何有关 Breeze 的文档。例如,当我在 Scaladoc 中查找 mapPairs 时,它只是说“创建一个包含此地图的转换副本的新地图”?看起来像一个非常强大的库,但没有任何文档很难进入。
    • 我希望有更多的文档。我主要是通过使用 REPL 来试验特性来学习的。该库确实遵循了一个通用模式,在 scala 中使用 CanBuildFrom 或在本例中为 CanMapKeyValuePairs 之类的接口似乎相当惯用。例如,mapPairs 是 TensorLike 特征的一部分,因此您也可以在其他对象中看到它。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多