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

rbpvctlc  于 2023-10-14  发布在  Python
关注(0)|答案(2)|浏览(132)

我有一个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]

这确实给出了正确的值,但没有零。我怎样才能把零放到正确的位置?
非常感谢你的帮助。

wmvff8tz

wmvff8tz1#

你可以用不同的方法来做:

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]])
fykwrbwg

fykwrbwg2#

np.where试试:
首先是数组:

size = (2, 2, 3)
array = np.random.random(size)
array

回报率:

array([[[0.36912456, 0.83634906, 0.44863801],
        [0.22061356, 0.83691007, 0.03133273]],

       [[0.47088168, 0.7737225 , 0.59968946],
        [0.59847542, 0.30779495, 0.12244422]]])

面具:

mask = np.random.choice([False, True], size=size, p=[.20, .80])
mask

回报率:

array([[[False,  True,  True],
        [False,  True,  True]],

       [[ True,  True,  True],
        [False,  True,  True]]])

最后是np.where

np.where(mask, array, 0)

回报率:

array([[[0.        , 0.83634906, 0.44863801],
        [0.        , 0.83691007, 0.03133273]],

       [[0.47088168, 0.7737225 , 0.59968946],
        [0.        , 0.30779495, 0.12244422]]])

相关问题