Python 在未排序的numpy数组中查找值列表的索引
我指的是一个类似的问题: 在这种情况下,我们有一个已排序的主数组和另一个要在主数组中查找索引的数组Python 在未排序的numpy数组中查找值列表的索引,python,arrays,numpy,Python,Arrays,Numpy,我指的是一个类似的问题: 在这种情况下,我们有一个已排序的主数组和另一个要在主数组中查找索引的数组 master = np.array([1,2,3,4,5]) search = np.array([4,2,2,3]) 建议的解决办法是: >>> master = np.array([1,2,3,4,5]) >>> search = np.array([4,2,2,3]) >>>np.searchsorted(master, search)
master = np.array([1,2,3,4,5])
search = np.array([4,2,2,3])
建议的解决办法是:
>>> master = np.array([1,2,3,4,5])
>>> search = np.array([4,2,2,3])
>>>np.searchsorted(master, search)
array([3, 1, 1, 2])
但如果master没有排序呢?
例如,如果我有两个这样的数组,其中第一个未排序:
>>>master = np.array([2,3,5,4,1])
>>>search = np.array([3,2,1,4,5])
我得到:
>>> np.searchsorted(master, search)
array([1, 0, 0, 2, 5])
但我想:
array([1,0,4,3,2])
i、 e.主目录中搜索项目的索引
如何使用numpy的本机函数获得它们?(不使用[np.where(master==i)表示搜索中的i])
谢谢
编辑:
在这种情况下,搜索数组是主数组的排列。然后,我想了解master的索引是如何排列的,以提供类似排列数组的搜索
一般情况下,搜索数组包含一些可能包含或不包含在主控中的项,例如:
>>>master = np.array([2,3,5,4,1])
>>>search = np.array([1,4,7])
免责声明:我为你写了这个答案。如果您想解决附录中的问题(当我们不只是寻找数组的排列时) 如果所有其他操作都失败,则需要临时对主数组进行排序,然后在匹配元素后反转此操作所需的排序顺序:
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]
上述结果是正确的
array([1, 0, 4, 3, 2])
正如您在评论中所指出的,您的特定
搜索
和主控
是彼此的排列。在这种情况下,您可以选择对两个数组进行排序,并将逆置换与其他直接置换结合使用:
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]
应该考虑搜索两个数组和在另一个排序版本中搜索一个数组所需的努力。我真的不知道哪一个更快。
这是对原来问题的回答。(当搜索
不是主控
的子集时,问题编辑未指定应返回的内容)
最终索引的结果为
array([3, 1, 0, 4, 4])
这是一个XY问题吗?你只是想找到一个给定数组的排列吗?因为这很容易做到。那么你想避免排序吗?结果不是您期望的结果,因为searchsorted
后面的算法假定输入要排序(就像在二进制搜索中)。在我的特定情况下,搜索是一个master排列(那么我的意思是找到导致搜索数组的master排列的索引)。这个答案的第一部分通常是错误的(尽管它适用于提供的测试用例)-假设问题要求final\u inds
,使得np.array\u相等(master[final\u inds],search)
是真的
@以后有机会的时候我会仔细看看的,谢谢。从时间戳来看,我可能还没有看到对这个问题的编辑。@威尔,对不起,我忘了跟进你的评论。你是对的,因为我怀疑我没有看到对这个问题的编辑。作为最简单的解决方案,我在顶部放了一个免责声明,如果读者正在寻找更一般的问题,请指向您的答案。
array([3, 1, 0, 4, 4])