2017-02-22 14 views
2

numpy.ma.masked_array()で作成されたマスクされた配列のnumpy.median()の動作に関する質問があります。マスクされた配列のnumpy.medianの予期しない動作

は、私は自分のコードをデバッグするからわかるてきたように、numpy.medianは()

答えて(問題の定義についてUsing numpy.median on a masked arrayを参照してください)マスクされた配列で期待どおりに動作しませんでした:

説明:正しく覚えていれば、np.medianはサブクラスをサポートしていないため、np.ma.MaskedArrayでは正しく動作しません。

したがって、マスクされた配列内の要素の中央値を計算するには、numpy.ma.median()を使用することです。これはマスクされた配列専用の中央値関数です。

私の問題は、この問題を知る方法がないため、この問題を見つけるのにかなりの時間を費やしたということにあります。

numpy.median()を使用してマスクされた配列の中央値を計算しようとすると、警告または例外が発生しません。

この関数によって返される応答は、予想されるものではなく、人々がこれを認識していないときに深刻な問題を引き起こします。

これはバグとみなされる可能性がありますか?

私の意見では、マスクされた配列でnumpy.medianを使用するといくつかの並べ替えの例外が発生することが予想される動作です。

は、以下のテストスクリプトは、マスクされた配列にnumpy.median使用の望ましくない予想外の挙動を示す(有効要素の正しいと予想中央値は2.5であることに注意!)を:

In [1]: import numpy as np 

In [2]: test = np.array([1, 2, 3, 4, 100, 100, 100, 100]) 

In [3]: valid_elements = np.array([1, 1, 1, 1, 0, 0, 0, 0], dtype=np.bool) 

In [4]: testm = np.ma.masked_array(test, ~valid_elements) 

In [5]: testm 
Out[5]: 
masked_array(data = [1 2 3 4 -- -- -- --], 
      mask = [False False False False True True True True], 
     fill_value = 999999) 

In [6]: np.median(test) 
Out[6]: 52.0 

In [7]: np.median(test[valid_elements]) 
Out[7]: 2.5 

In [8]: np.median(testm) 
Out[8]: 4.0 

In [9]: np.ma.median(testm) 
Out[9]: 2.5 
+0

ここであなたの苦情は、 'np.median'は動作しませんが、' np.ma.median'はしますか? – Eric

+0

sort of of ...私の苦情は、マスクされた配列に適用されたときにnp.medianが間違った結果をもたらすことを示すものではありません。私にとっては、個人的には、時にはかなりうんざりしています。この間違ったnp.median値は検出されません。したがって、np.ma.medianは動作しませんが、np.medianはマスクされた配列の不正確な結果を示すものではありません。 –

+0

マスクされた配列で多数の 'np。*'関数が正しく動作しません。問題は、 'np。*'関数はマスクされた配列が存在することさえ知りません。 – Eric

答えて

3

これはバグとみなされる可能性がありますか?

まあ、バグです!私は数ヶ月前に彼らのissue tracker()に投稿しました。

この現象の理由は、np.median入力アレイのpartition方法を使用するが、partition方法np.ma.MaskedArrayオーバーライドしないことです。したがって、arr.partitionnp.medianで呼び出された場合、デフォルトではnumpy.ndarray.partitionという方法がデフォルトになります(これはマスクされた配列では偽です)。