2016-04-14 75 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努力做得更加通用,并且它不会充分利用你的问题的简单结构......虽然总成本将会受到背后的相同争论的支配场景。