numpy 搜索多个值的数组,并返回它们的索引

Doa*_*oaa 5 arrays search numpy python-3.x

如何在 numpy 数组中搜索一小组值(未排序,不应更改)?它应该返回这些值的索引。

例如:

a = np.array(['d', 'v', 'h', 'r', 'm', 'a'])   # in general it will be large
query = np.array(['a', 'v', 'd'])

# Required:
idnx = someNumpyFunction(a, query)

print(indx)       # should be [5, 1, 0]
Run Code Online (Sandbox Code Playgroud)

我是 numpy 的初学者,我找不到同时为多个值执行此任务的正确方法(我知道 np.where(a=='d') 可以执行单个值搜索) .

hpa*_*ulj 4

检查一个数组与另一个数组的一种经典方法是调整形状并使用“==”:

In [250]: arr==query[:,None]
Out[250]: 
array([[False, False, False, False, False,  True],
       [False,  True, False, False, False, False],
       [ True, False, False, False, False, False]], dtype=bool)

In [251]: np.where(arr==query[:,None])
Out[251]: (array([0, 1, 2]), array([5, 1, 0]))
Run Code Online (Sandbox Code Playgroud)

query如果在 中找不到某个元素a,则其“行”将丢失,例如[0,2]而不是[0,1,2]

In [261]: np.where(arr==np.array(['a','x','v'],dtype='S')[:,None])
Out[261]: (array([0, 2]), array([5, 1]))   
Run Code Online (Sandbox Code Playgroud)

对于这个小例子,它比等效的列表理解要快得多:

np.hstack([(arr==i).nonzero()[0] for i in query])
Run Code Online (Sandbox Code Playgroud)

它比searchsorted解决方案慢一点。(在该解决方案中,如果未找到元素,i则超出范围)。query


斯特凡诺提议道fromiterhstack与列表相比,它节省了一些时间:

In [313]: timeit np.hstack([(arr==i).nonzero()[0] for i in query])10000 loops, best of 3: 49.5 us per loop

In [314]: timeit np.fromiter(((arr==i).nonzero()[0] for i in query), dtype=int, count=len(query))
10000 loops, best of 3: 35.3 us per loop
Run Code Online (Sandbox Code Playgroud)

但是,如果缺少一个元素,或者多次出现,则会引发错误。 hstack可以处理可变长度条目,fromiter但不能。

np.flatnonzero(arr==i)比 慢().nonzero()[0],但我还没有研究为什么。