5

numpy masked-array mean メソッドは、おそらくすべきではない場合に異なる型を返すことに気付きました。

import numpy as np

A = np.ma.masked_equal([1,1,0], value=0)
B = np.ma.masked_equal([1,1,1], value=0) # no masked values

type(A.mean())
#numpy.float64
type(B.mean())
#numpy.ma.core.MaskedArray

他のnumpy.ma.core.MaskedArray方法は一貫しているようです

type( A.sum()) == type(B.sum())
# True
type( A.prod()) == type(B.prod())
# True
type( A.std()) == type(B.std())
# True
type( A.mean()) == type(B.mean())
# False

誰かがこれを説明できますか?

更新:コメントで指摘されているように

C = np.ma.masked_array([1, 1, 1], mask=[False, False, False])
type(C.mean()) == type(A.mean())
# True 
4

1 に答える 1

1

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に一致する配列です。dataBスカラー であり、それFalsemean特殊なケースとして扱っています。

これが何を意味するのかを確認するには、もう少し掘り下げる必要があります。

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

于 2016-07-02T22:15:05.007 に答える