每个元素 multiplication/addition 与 numpy 数组

Per element multiplication/addition with numpy arrays

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

有一张图片,我只需要重新计算非零像素。我想通过 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吗?

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

另一种方式是:

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

您可能有兴趣了解 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. ]])