2017-05-29 132 views
2

如果值不在数组中,则np.ma.masked_equalmasked_values不会创建False的掩码,而是标量。numpy masked_array mask更改类型

实施例:

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

产生掩蔽阵列枝条掩模为10个假值的阵列,而

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

产生具有设置为标量假掩模掩蔽阵列。其结果是,因为在我的代码,我不事先知道面具是否匹配数组中的任何条目,我不得不明确检查:

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

这似乎是一个过劳给我。这种行为的原因是什么,有没有办法避免它?

回答

2

您可以简单地创建MaskedArray youself:

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(这是一个garantueed constant):

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

+1

非常感谢。我猜这是有道理的,而且我可能过于热衷于使用masked_equal或masked_values,但我不确定我是否理解为什么numpy试图最大限度地减少内存需求,而不是直接创建masked_array时使用上下文。 –