2

如果值不在数组中,而是在标量中,np.ma.masked_equal或者不会创建 False 掩码,我对此感到有些惊讶。masked_values

例子 :

y = np.arange(10)
yy = np.ma.masked_equal(y,0)

产生一个掩码数组,掩码是一个包含 10 个 False 值的数组,而

y = np.arange(1,10) 
yy = np.ma.masked_equal(y,0)

产生一个掩码数组,掩码设置为标量 False。结果,鉴于在我的代码中我事先不知道掩码是否与数组中的任何条目匹配,我不得不明确检查:

yy=np.ma.masked_values(y,0)
if np.isscalar(yy.mask):
    yy.mask=np.zeros(y.shape,dtype=bool)

这对我来说似乎是一种过度劳累。这种行为的原因是什么,有没有办法避免它?

4

1 回答 1

2

您可以简单地创建MaskedArray自己:

yy = np.ma.MaskedArray(y, mask=(y==0))

似乎 NumPy 试图最小化内存需求并加快计算速度,以防不MaskedArray被屏蔽。

numpy.ma.nomask

指示掩码数组没有无效条目的值。nomask在不需要掩码时在内部使用以加快计算速度。

如果您检查:

>>> np.ma.nomask
False

所以单曲False代表“不戴面具”。所以你也可以检查maskedarr.mask is np.ma.nomask(这是一个保证常数):

yy = some_operation_that_creates_a_masked_array
if yy.mask is np.ma.nomask:
    yy.mask = np.zeros(yy.shape, dtype=bool)

那带有更多的上下文np.isscalar

于 2017-05-29T16:59:47.967 回答