0

Python パッケージをデバッグすると、次の問題に遭遇しました。

numpy mean 関数にマスクされた配列を与える病理学的なケースでは、戻り値の型はマスクされた配列です。

>>> import numpy as np
>>> import numpy.ma as ma
>>> a=ma.array([1,2])
>>> np.mean(a)
masked_array(data = 1.5,
             mask = False,
       fill_value = 1e+20)

一方、sum 関数に同じマスク配列を渡すと、戻り値の型は float になります。

>>> np.sum(a)
3

この動作が意図されているかどうか、誰かが考えを持っていますか?もしそうなら、背後にある理由は何ですか?

Python バージョン 2.7.12 および Python 3.5.2 でテスト済み。

4

1 に答える 1

0

ドキュメントに示されている例では、ma.mean両方ともスカラーを返します

In [1217]: b = np.ma.array([1,2,3], mask=[False, False, True])
In [1218]: b.mean()
Out[1218]: 1.5
In [1219]: b.sum()
Out[1219]: 3

mask がFalse配列ではなく scalar であるという点で、ケースは異なります。

In [1220]: a=np.ma.array([1,2,3])
In [1221]: a
Out[1221]: 
masked_array(data = [1 2 3],
             mask = False,
       fill_value = 999999)
In [1222]: a.mean()
Out[1222]: 
masked_array(data = 2.0,
             mask = False,
       fill_value = 999999)
In [1223]: a.sum()
Out[1223]: 6

それは本当に違いを生むべきではありません。これについての議論を見たのを漠然と思い出します。それが別の SO にあったのか、バグの問題だったのかは覚えていません。また、修正された可能性もあります。いくつか検索する必要があります。私の派手なバージョンは「1.11.0」です

問題は、 masked の開始位置にある行ですmean

if self._mask is nomask:
   result = super(MaskedArray, self).mean(axis=axis, dtype=dtype)

nomaskスカラーFalseです。したがって、あなたのa場合、そのマスクで特別なことをすることなく、通常のnumpy meanを実行しようとします。しかし、それは入力と同じサブクラスの結果を返そうとします。

マスクを配列に変更aすると、問題が「修正」されます。

In [1247]: a.mask=[False,False,False]

==============

OK、複製はサイドバーに隠れていました

numpy.ma (マスクされた) 配列の平均メソッドの戻り値の型に一貫性がない

昨年 7 月にバグの問題を見つけましたが、パッチはありません。

于 2016-10-24T21:47:57.303 に答える