【问题标题】:Per element multiplication/addition with numpy arrays使用 numpy 数组的每个元素的乘法/加法
【发布时间】:2019-08-15 13:33:49
【问题描述】:

我遇到了一个奇怪的问题。

有一个图像,我只需要重新计算非零像素。我想通过numpy 来做这件事,因为我处理了数千张图片,而且我需要它的速度。

这是一个具有较低维度的简化示例。

假设我有以下矩阵:

[[0,  0,  1],
 [0,  2,  0],
 [0,  6,  0]]

假设我想将每个值乘以 2.0 并添加 0.5

matrix = matrix * 2.0 + 0.5

结果是:

[[0.5,  0.5,   2.5],
 [0.5,  4.5,   0.5],
 [0.5,  12.5,  0.5]]

我希望它是:

[[0,  0,   2.5],
 [0,  4.5,   0],
 [0,  12.5,  0]]

显然,我可以在 for 循环中使用 if pixel == 0: continue 执行此操作,但这会非常慢。而且我无法摆脱只剩下规范化组件的添加。

所以我一直在想,可以通过numpy 完成吗?

【问题讨论】:

    标签: python python-3.x numpy slice numpy-ndarray


    【解决方案1】:

    您可以使用np.where 来根据指定条件从 x 或 y 中进行选择:

    a = np.array([[0,  0,  1],
                  [0,  2,  0],
                  [0,  6,  0]])
    
    np.where(a!=0, a*2. + 0.5, a)
    
    array([[ 0. ,  0. ,  2.5],
           [ 0. ,  4.5,  0. ],
           [ 0. , 12.5,  0. ]])
    

    【讨论】:

    • 太好了,这正是我想要的!
    • 不会 np.where(np.logical_or(a e), a*2. + 0.5, a) 其中 e 是一个接近于零的浮点数,标记从哪里可以认为该值等于零的阈值更好?或者 numpy 是否已经考虑到这一点并且可能有一个参数来调整它?
    【解决方案2】:

    另一种方法是:

    matrix = matrix * 2.0 + 0.5 * (matrix!=0)
    

    【讨论】:

      【解决方案3】:

      您可能有兴趣了解使用np.where 的另一种方式。在这里检查值是否小于 1,将它们分配给 0

      matrix = matrix*2 + 0.5
      np.where(matrix<1, 0, matrix)
      # array([[ 0. ,  0. ,  2.5],
      #        [ 0. ,  4.5,  0. ],
      #        [ 0. , 12.5,  0. ]])
      

      【讨论】:

        猜你喜欢
        • 2015-05-13
        • 1970-01-01
        • 1970-01-01
        • 2019-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-23
        相关资源
        最近更新 更多