2017-02-22 75 views
2

我有一個問題,有關numpy.median()在numpy.ma.masked_array()創建的屏蔽陣列上的行爲。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

...我的抱怨是,它沒有給出任何跡象(即使在文檔中)np.median在將其應用於蒙版數組時給出錯誤結果。對我個人來說,有時候會很sl,,這個錯誤的np.median值將不被發現。所以,抱怨並不是說np.ma.median能夠工作,但是np.median並沒有在掩模陣列上給出錯誤結果的任何跡象。 –

+0

大量的'np。*'函數在掩碼陣列上無法正常工作。問題是,'np。*'函數甚至不知道掩碼數組存在。 – Eric

回答

3

有誰知道這可能被認爲是一個錯誤?

那麼,這是一個錯誤!我幾個月前在他們的問題追蹤器上發佈了它()。

此行爲的原因是np.median使用輸入數組的partition方法,但np.ma.MaskedArray不覆蓋partition方法。因此,當arr.partitionnp.median中被調用時,它只是默認爲基本的numpy.ndarray.partition方法(這是僞造數組僞造的!)。