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.countnomaskケースではスカラーを返しますが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です。現在、または近い将来、開発マスターに修正が加えられる可能性があります。