在您的最后一个案例中:
In [197]: bs=b1.sum()
In [198]: bs.data
Out[198]: array(0.0)
In [199]: bs.mask
Out[199]: array(True, dtype=bool)
In [200]: repr(bs)
Out[200]: 'masked'
In [201]: str(bs)
Out[201]: '--'
如果我指定
keepdims
,那么我将获得一个不同的数组:
In [208]: bs=b1.sum(keepdims=True)
In [209]: bs
Out[209]:
masked_array(data = [--],
mask = [ True],
fill_value = 999999)
In [210]: bs.data
Out[210]: array([0])
In [211]: bs.mask
Out[211]: array([ True], dtype=bool)
以下是与sum
代码相关的部分:
def sum(self, axis=None, dtype=None, out=None, keepdims=np._NoValue):
kwargs = {} if keepdims is np._NoValue else {'keepdims': keepdims}
_mask = self._mask
newmask = _check_mask_axis(_mask, axis, **kwargs)
if out is None:
result = self.filled(0).sum(axis, dtype=dtype, **kwargs)
rndim = getattr(result, 'ndim', 0)
if rndim:
result = result.view(type(self))
result.__setmask__(newmask)
elif newmask:
result = masked
return result
....
It's the
newmask = np.ma.core._check_mask_axis(b1.mask, axis=None)
...
elif newmask: result = masked
在你的情况下,产生masked
值的行。当所有的值都被屏蔽时,newmask
为True,而如果有些值没有被屏蔽,则为False。选择返回np.ma.masked
是故意的。
计算的核心是:
In [218]: b1.filled(0).sum()
Out[218]: 0
剩下的代码决定是返回一个标量还是遮罩数组。
============
另外,针对您的补充:
In [232]: np.ma.masked+3
Out[232]: masked
看起来np.ma.masked
是一个特殊的数组,可以在计算中传播自己。有点像np.nan
。
sum
代码的相关部分。当输入完全被屏蔽时,我可以理解返回值可能存在一些歧义。我不知道是否有任何关于这是否正确的争论。如果您不喜欢结果,可以将sum
应用于b.filled(0)
。 - hpauljnp.nan
的比较非常准确。我想我可以按照你的写法做b.filled(0).sum()
。 - orangenp.nan
的处理方式,但是这样就应该有一个特殊的sum()
函数,比如nansum()
。 - orange