在未排序的 numpy 数组中查找值列表的索引

cla*_*dev 5 python arrays numpy

我指的是一个类似的问题:在 numpy 数组中查找值列表的索引

在这种情况下,我们有一个已排序的主数组和另一个我们想要在主数组中找到索引的数组。

master = np.array([1,2,3,4,5])
search = np.array([4,2,2,3])
Run Code Online (Sandbox Code Playgroud)

建议的解决方案是:

>>> master = np.array([1,2,3,4,5])
>>> search = np.array([4,2,2,3])
>>>np.searchsorted(master, search)
array([3, 1, 1, 2])
Run Code Online (Sandbox Code Playgroud)

但是如果 master 没有被排序呢?例如,如果我有两个这样的数组,其中第一个未排序:

>>>master = np.array([2,3,5,4,1])
>>>search = np.array([3,2,1,4,5])
Run Code Online (Sandbox Code Playgroud)

我得到:

>>> np.searchsorted(master, search)
array([1, 0, 0, 2, 5])
Run Code Online (Sandbox Code Playgroud)

但相反,我想:

array([1,0,4,3,2])
Run Code Online (Sandbox Code Playgroud)

即在 master 中搜索的项目的索引。

我如何使用 numpy 的本机功能获取它们?(不使用 [np.where(master==i) for i in search])

谢谢

编辑:在这种情况下,搜索数组是 master 的排列。然后我想找到如何排列 master 的索引以提供类似搜索的排列数组。

作为一般情况,搜索数组包含一些可能包含或不包含在 master 中的项目,例如:

>>>master = np.array([2,3,5,4,1])
>>>search = np.array([1,4,7])
Run Code Online (Sandbox Code Playgroud)

And*_*eak 3

免责声明:我为问题的早期修订写了这个答案。如果您想解决附录中的问题(当我们不仅仅是寻找数组的排列时),请参阅 Will 的回答

如果所有其他方法都失败,您需要暂时对主数组进行排序,然后在匹配元素后反转所需的排序顺序:

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]
Run Code Online (Sandbox Code Playgroud)

上面的结果是正确的

array([1, 0, 4, 3, 2])
Run Code Online (Sandbox Code Playgroud)

正如您在评论中指出的,您的具体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]
Run Code Online (Sandbox Code Playgroud)

人们应该考虑搜索两个数组所需的工作量与在另一个数组的排序版本中搜索一个数组所需的工作量。我实在分不清哪个更快。