B.mask
で始まる:
if self._mask is nomask:
result = super(MaskedArray, self).mean(axis=axis, dtype=dtype)
np.ma.nomask
ですFalse
。
これはあなたの場合ですB
:
masked_array(data = [1 1 1],
mask = False,
fill_value = 0)
マスクは、サイズA
に一致する配列です。data
はB
スカラー であり、それFalse
をmean
特殊なケースとして扱っています。
これが何を意味するのかを確認するには、もう少し掘り下げる必要があります。
In [127]: np.mean(B)
Out[127]:
masked_array(data = 1.0,
mask = False,
fill_value = 0)
In [141]: super(np.ma.MaskedArray,B).mean()
Out[141]:
masked_array(data = 1.0,
mask = False,
fill_value = 0)
それが役立つかどうかはわかりません。np.ndarray
メソッドとnp
関数とメソッドの間に循環参照があり、np.ma
どのコードが使用されているかを正確に特定するのが難しくなっています。コンパイルされたmean
メソッドを使用しているようですが、マスキングをどのように処理するかは明らかではありません。
使うのが目的なのかな
np.mean(B.data) # or
B.data.mean()
super
メソッド fetch は正しいアプローチではありません。
いずれにせよ、同じ配列ですが、ベクトル マスクを使用すると、スカラーが返されます。
In [132]: C
Out[132]:
masked_array(data = [1 1 1],
mask = [False False False],
fill_value = 0)
In [133]: C.mean()
Out[133]: 1.0
====================
nomask
ショートカットなしでこの方法を試すと、後にエラーが発生します
dsum = self.sum(axis=axis, dtype=dtype)
cnt = self.count(axis=axis)
if cnt.shape == () and (cnt == 0):
result = masked
else:
result = dsum * 1. / cnt
self.count
nomask
ケースではスカラーを返しますがnp.int32
、通常のマスキングでは a を返します。だからcnt.shape
チョーク。
trace
このsuper(MaskedArray...)
「近道」を試みる他の唯一のマスクされたメソッドです。意地悪なコードには明らかに何かおかしなところがあります。
====================
関連するバグの問題: https://github.com/numpy/numpy/issues/5769
それによると、昨年ここで同じ質問が提起されました: Testing equivalence of means of Numpy MaskedArray instances raises attribute error
だけでなく、多くのマスキングの問題があるようmean
です。現在、または近い将来、開発マスターに修正が加えられる可能性があります。