如何在 numpy 数组上应用掩码,如果掩码的值为 True,则原始值保持不变,如果为 False,则将其设置为零?

How can one apply a mask on a numpy array which leaves the original values unchanged if the mask's value is True and sets it to zero if False?

我有一个 3D numpy 数组:


image = np.random.random((2, 2, 3))

[[[0.01188816 0.46263957 0.00943777]
  [0.0742566  0.8375209  0.259363  ]]

 [[0.30823133 0.17924745 0.74292469]
  [0.68490255 0.03143513 0.68233715]]]

和面具:

[[[ True  True  True]
  [False False False]]

 [[False False False]
  [False False False]]]

期望的输出:

[[[0.01188816 0.46263957 0.00943777]
  [0          0.         0.        ]]

 [[0.         0.         0.        ]
  [0.         0.         0.        ]]]

因此,原始数组应该根据掩码进行修改-如果掩码的值为False,则条目应设置为0,否则保持不变。

我尝试了什么:

(image[unknown_array])
[0.01188816 0.46263957 0.00943777]

这确实给出了正确的值,但没有零。我怎样才能把零放到正确的位置?

非常感谢您的帮助。

您可以使用不同的方式来完成:

x = np.arange(1,7).reshape(2,3)  # numbers from 1 to 6
mask = x % 2 == 0                # mask for even numbers
print(x, mask)
# (array([[1, 2, 3],
#         [4, 5, 6]]),
#  array([[False,  True, False],
#         [ True, False,  True]]))

Szczesny 建议可能是最简单的:

y = x * mask
print(y)
# array([[0, 2, 0],
#        [4, 0, 6]])

“手动”填充 y 数组:

y = np.zeros_like(x)
y[mask] = x[mask]
print(y)
# array([[0, 2, 0],
#        [4, 0, 6]])