2016-10-13 38 views
2

我指的是一個類似的問題:Find indices of a list of values in a numpy array查找值的列表的索引中沒有排序numpy的陣列

在我們有我們想要找到被排序的主數組和另一個數組這種情況下,主數組中的索引。

master = np.array([1,2,3,4,5]) 
search = np.array([4,2,2,3]) 

建議的解決方案是:

>>> master = np.array([1,2,3,4,5]) 
>>> search = np.array([4,2,2,3]) 
>>>np.searchsorted(master, search) 
array([3, 1, 1, 2]) 

但是,如果主人沒有排序是什麼? 例如,如果我有兩個陣列,這樣,其中第一個是沒有排序:

>>>master = np.array([2,3,5,4,1]) 
>>>search = np.array([3,2,1,4,5]) 

我得到:

>>> np.searchsorted(master, search) 
array([1, 0, 0, 2, 5]) 

而是我想:

array([1,0,4,3,2]) 

即在主搜索中的項目索引。 ?

我如何獲得它們可能與numpy的的本地函數(不使用[np.where(主== i)對於我在搜索])

感謝

編輯: 在這如果搜索數組是主數據的排列。然後我想知道如何將主索引置換爲像搜索這樣的排列數組。

由於一般情況下,搜索陣列包含可能包含或不主,如一些項目:

>>>master = np.array([2,3,5,4,1]) 
>>>search = np.array([1,4,7]) 
+0

這是一個XY問題嗎?你只是想找到一個給定數組的*排列*?因爲這可以很容易地完成。 –

+0

那麼你想避免排序呢?結果不是你所期望的,因爲'searchsorted'背後的算法假設輸入被排序(如在二進制搜索中)。 – rubik

+0

在我的具體情況下,搜索是master的排列(然後,我的意思是找到導致搜索數組的master的排列索引) –

回答

1

如果一切都失敗了,你需要暫時整理你的主數組,然後反轉排序順序

import numpy as np 

master = np.array([2,3,5,4,1]) 
search = np.array([3,2,1,4,5]) 

# sorting permutation and its reverse 
sorti = np.argsort(master) 
sorti_inv = np.empty(sorti.shape,dtype=np.int64) 
sorti_inv[sorti] = np.arange(sorti.size) 

# get indices in sorted version 
tmpind = np.searchsorted(master,search,sorter=sorti) 

# transform indices back to original array with inverse permutation 
final_inds = tmpind[sorti_inv] 

的上述結果是正確

array([1, 0, 4, 3, 2]) 
:匹配元素後所需要的這個

正如您在評論中指出的,您的具體searchmaster是彼此的置換。在這種情況下,您也可以排序陣列,並使用逆置換與其他直接排列組合:

sorti = np.argsort(master) 
sorti_inv = np.empty(sorti.shape,dtype=np.int64) 
sorti_inv[sorti] = np.arange(sorti.size) 
sorti_s = np.argsort(search) 
final_inds = sorti_s[sorti_inv] 

每個人都應該考慮到搜索兩個數組VS中的排序版本搜索一個陣列所需的工作量另一個。我真的不知道哪一個更快。