2016-04-14 87 views
1

說我有兩個數組,大小相同,沒有重複,在陣列1的每個項目在數組2:創建索引圖兩個數組

arr1 = np.array([100,200,50,150]) 
arr2 = np.array([150,200,100,50]) 

什麼是找到索引圖INDS這樣,最好的辦法arr2 [inds]返回arr1?

我目前的解決方案的工作,但我不知道是否有更多的東西numpyish這將是更有效的大型陣列:

ind21 = map(lambda x:np.abs(x-arr2).argmin(),arr1) 

In [57]: arr1,arr2[ind21] 
Out[57]: (array([100, 200, 50, 150]), array([100, 200, 50, 150])) 

回答

1

OK,回答我的問題,這是非常快:

ind1 = np.argsort(arr1) 
indrev1 = np.argsort(ind1) 
ind2 = np.argsort(arr2) 
ind21 = ind2[indr1] 

In [101]: arr1,arr2[ind21] 
Out[101]: (array([100, 200, 50, 150]), array([100, 200, 50, 150])) 
+0

可愛的發現一個,必須相當有效!對於2D案例非常相似的情況導致我使用'argsort'作爲另一個解決方案 - http://stackoverflow.com/a/36536068/3293881 – Divakar

0

numpy_indexed包免責聲明:我是它的作者)提供了一個簡單,完全量化的辦法解決這個問題:

import numpy_indexed as npi 
ind = npi.indices(arr1, arr2) 

可能比你的解決方案慢一點,因爲npi努力做得更加通用,並且它不會充分利用你的問題的簡單結構......雖然總成本將會受到背後的相同爭論的支配場景。