あなたの最後のケースでは:
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
....
それは
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
。