2014-12-02 17 views
2

一個數組,我想:numpy.searchsorted含numpy.nan

index = numpy.searchsorted(array([ 1., 2., 3., nan, 4., 5.]), 4.2, side='left') 

給我:

index = 4 

這個工程到價值3.9,但不是在該nan後陣列。

任何想法?

回答

3

您正在排序的數組未被排序,它需要爲searchsorted正常工作。 np.nan將數組排序去年出現:

>>> np.sort([1., 2., 3., nan, 4., 5.]) 
array([ 1., 2., 3., 4., 5., nan]) 

要解決這個問題,你可以在使用sorter關鍵字參數您的陣列的分類索引列表通過。您可以使用np.argsort找到這樣的:

>>> arg_sorted = np.argsort([1., 2., 3., nan, 4., 5.]) 
>>> np.searchsorted([1., 2., 3., nan, 4., 5.], 4.2, side='right', sorter=arg_sorted) 
4      

編輯:按照下面海梅的評論,傳遞sorter參數將意味着該函數返回數組排序(而不是在未排序的)中的位置。由於side='left'指定第一個合適的索引應返回,正確的索引可以更好地識別使用np.searchsorted以下方法:

>>> idx = np.searchsorted([1., 2., 3., nan, 4., 5.], 4.2, side='left') 
>>> arg_sorted[idx] 
4 
+1

當您使用'sorter'參數時,它將返回排序數組中的位置,而不是未排序的數組中的位置。如果你已經使用了'side ='left'',就像OP一樣,你會得到'3'作爲回報​​,這是正確的,但不是OP想要的。在這種情況下,唯一的問題是擺脫nans,爲了得到正確的索引,你必須做'arg_sorted [idx]',其中'idx'是你調用'np.searchsorted'的返回值。 – Jaime 2014-12-02 20:07:43

+0

感謝你讓事情變得順利,海梅。我明顯寫得太急了,錯過了細節!我已經編輯過整合你的評論,如果我的措辭仍然不足,可以進一步編輯。 – 2014-12-02 23:16:22

0

我沒有足夠的聲譽添加評論,所以我會添加我的兩美分答案。

我有一個類似的挑戰,並且據我所知,這個問題可能與answer有關。

爲了說明我的觀點,我所討論的陣列擴大與附加元件

a = np.array([1., 2., 3., np.nan, 4., 5., 6.]) 

和此外調用argsort算法之前

arg_sorted = np.argsort(a) 

,除了發現4.2,我也考慮5.2。然後,所提出的解決方案的輸出是

for x in [4.2, 5.2]: 
    ind_tmp = np.searchsorted(a, x, side='left') 
    ind = arg_sorted[ind_tmp] 
    print('x={}, ind={}'.format(x, ind)) 

x=4.2, ind=4 
x=5.2, ind=4 

凡相信更正確的答案是使用sorter參數發現,像這樣

for x in [4.2, 5.2]: 
    ind_tmp = np.searchsorted(a, x, side='left', sorter=arg_sorted) 
    ind = arg_sorted[ind_tmp] 
    print('x={}, ind={}'.format(x, ind)) 

x=4.2, ind=5 
x=5.2, ind=6 

在這種情況下,5.2以上的指數一個在發現4.2,與原來的答案相反,更符合我對正確解決方案的理解。