2015-08-24 146 views
9

是否有任何方法可以同時獲取NumPy數組中的多個元素的索引?一次獲取NumPy數組中的多個元素的索引

E.g.

import numpy as np 
a = np.array([1, 2, 4]) 
b = np.array([1, 2, 3, 10, 4]) 

我想找到的a每個元素的索引b,即:[0,1,4]

我發現我使用的是有點冗長的解決方案:

import numpy as np 

a = np.array([1, 2, 4]) 
b = np.array([1, 2, 3, 10, 4]) 

c = np.zeros_like(a) 
for i, aa in np.ndenumerate(a): 
    c[i] = np.where(b==aa)[0] 

print('c: {0}'.format(c)) 

輸出:

c: [0 1 4] 
+1

np.where(np.in1d(b,a))returns(array([0,1,4],dtype = int64),)。基於http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html上的最後一個示例。 –

回答

12

你可以使用in1dnonzero(或where爲此事):

>>> np.in1d(b, a).nonzero()[0] 
array([0, 1, 4]) 

這適用於您的示例數組,但通常ar返回索引的光線不符合a中值的順序。這可能是一個問題,取決於你接下來要做什麼。

在這種情況下,更好的答案是一個@Jaime使用searchsortedhere,:

>>> sorter = np.argsort(b) 
>>> sorter[np.searchsorted(b, a, sorter=sorter)] 
array([0, 1, 4]) 

這爲它們出現在a返回指數值。例如:

a = np.array([1, 2, 4]) 
b = np.array([4, 2, 3, 1]) 

>>> sorter = np.argsort(b) 
>>> sorter[np.searchsorted(b, a, sorter=sorter)] 
array([3, 1, 0]) # the other method would return [0, 1, 3] 
2

這是使用numpy-indexed包一個簡單的一行(聲明:我是它的作者):

import numpy_indexed as npi 
idx = npi.indices(b, a) 

的實現是完全矢量化,並且它可以讓你控制處理缺失值。此外,它也適用於nd數組(例如,查找b中行的索引)。

相關問題