一個數組,我想:numpy.searchsorted含numpy.nan
index = numpy.searchsorted(array([ 1., 2., 3., nan, 4., 5.]), 4.2, side='left')
給我:
index = 4
這個工程到價值3.9
,但不是在該nan
後陣列。
任何想法?
一個數組,我想:numpy.searchsorted含numpy.nan
index = numpy.searchsorted(array([ 1., 2., 3., nan, 4., 5.]), 4.2, side='left')
給我:
index = 4
這個工程到價值3.9
,但不是在該nan
後陣列。
任何想法?
您正在排序的數組未被排序,它需要爲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
我沒有足夠的聲譽添加評論,所以我會添加我的兩美分答案。
我有一個類似的挑戰,並且據我所知,這個問題可能與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,與原來的答案相反,更符合我對正確解決方案的理解。
當您使用'sorter'參數時,它將返回排序數組中的位置,而不是未排序的數組中的位置。如果你已經使用了'side ='left'',就像OP一樣,你會得到'3'作爲回報,這是正確的,但不是OP想要的。在這種情況下,唯一的問題是擺脫nans,爲了得到正確的索引,你必須做'arg_sorted [idx]',其中'idx'是你調用'np.searchsorted'的返回值。 – Jaime 2014-12-02 20:07:43
感謝你讓事情變得順利,海梅。我明顯寫得太急了,錯過了細節!我已經編輯過整合你的評論,如果我的措辭仍然不足,可以進一步編輯。 – 2014-12-02 23:16:22