2016-04-27 77 views
0

在numpy.searchsorted中這是一種有趣的行爲。以下測試失敗:我在做什麼numpy searchsorted錯誤?

import numpy as np 

a = np.ma.masked_array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
         17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 
         31, 32, 33, 0], 
         mask=[False, False, False, False, False, False, False, 
          False, False, False, False, False, False, False, 
          False, False, False, False, False, False, False, 
          False, False, False, False, False, False, False, 
          False, False, False, False, False, True], 
         fill_value=0, dtype='uint8') 

b = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
       17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 33], 
      dtype='uint8') 

expected = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
       14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 
       28, 29, 32]) 

c = a.searchsorted(b) 

np.testing.assert_array_equal(c, expected) 

c數組中的最後一項是34,我不知道爲什麼。 但是類似的一個,將它傳遞:

aa = np.ma.masked_array([1, 2, 3, 4, 0], 
         mask=[False, False, False, False, True], 
         fill_value=0, dtype='uint8') 

bb = np.array([1, 3, 4], dtype='uint8') 

expectedd = np.array([0, 2, 3]) 

cc = aa.searchsorted(bb) 

np.testing.assert_array_equal(cc, expectedd) 

numpy.array.searchsorted文檔,其描述表示:

查找索引到排序後的數組一個,使得如果v中的相應元件之前插入指數,a的順序將被保留。

+1

第一輸入'因爲了'不排序的'零「,所以你可能不得不使用'np.searchsorted'的附加輸入arg'sorter'。 – Divakar

+0

@Divakar它被排序是因爲它是一個被屏蔽的數組,所以被屏蔽的值是最後一個和'numpy'來定義這個順序。如果你在'a'上使用'argsort'方法,它會給你索引作爲一個有序序列 – jmbarrios

+0

嗯,是的,我沒有考慮。 – Divakar

回答

0

np.searchsorted還不支持被屏蔽的數組(see here獲取支持的方法列表)。

您可以通過手動索引aa.mask倒數,然後傳遞結果作爲第一個參數np.searchsorted得到預期的結果:

c = np.searchsorted(a[~a.mask], b) 

# or alternatively, a[~a.mask].searchsorted(b) 

print(np.allclose(c, expected)) 
# True 
+0

numpy支持[搜索排序爲掩碼數組](http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.ma.MaskedArray.searchsorted.html) 同樣在第二種情況下,用'aa','bb'和'cc',我得到了預期的結果,但問題出在第一種情況。 – jmbarrios

+0

對不起,我最初使用了錯誤的測試用例。 '.searchsorted'方法只是從'numpy.ndarray'繼承而來的 - 它在「忽略掩碼」的意義上是「不支持的」。 –