在你最後一種情況:
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)
# No explicit output
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
....
這是產生在你的情況masked
值
newmask = np.ma.core._check_mask_axis(b1.mask, axis=None)
...
elif newmask: result = masked
線。 newmask
在所有值都被屏蔽的情況下爲真,而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
。
我預計要返回一個標值,而不是一個數組(它已經結束了,我找所有尺寸的總和)。 – orange
我加了'sum'代碼的相關部分。我可以理解,爲什麼當輸入被完全屏蔽時,返回值可能會有一些不明確的地方。關於這是否正確,我不知道任何辯論。如果你不喜歡這個結果,你可以將總和應用於'b.filled(0)'。 – hpaulj
看起來像推理是'如果所有值都被屏蔽了,它就不能給出正確的標量值(即使總和的起始值爲0)'。 – hpaulj