使用后查找未排序的索引numpy.searchsorted

2024-06-07 15:02:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大的(数百万)ID号数组ids,我想找到ids数组中另一个目标数组(targets)所在的索引。例如,如果

ids = [22, 5, 4, 0, 100]
targets = [5, 0]

然后我想要结果:

^{pr2}$

如果我对ids数组进行预排序,那么使用numpy.searchsorted很容易找到匹配项

>>> ids = np.array([22, 5, 4, 0, 100])
>>> targets = [5, 0]
>>> sort = np.argsort(ids)
>>> ids[sort]
[0,4,5,22,100]
>>> np.searchsorted(ids, targets, sorter=sort)
[2,0]

但是我如何找到这个结果的反向映射呢?一、 将[2,0]处排序的条目映射回它们之前的位置:[1,3]。在


Tags: numpyidids目标排序np条目数组
3条回答

你能这么做吗?在

sort[np.searchsorted(ids, targets, sorter=sort)]

或者:

^{pr2}$

两者都给出:

array([1, 3])

已经有一些答案围绕着这个问题,但要想弄清楚,您需要做的就是使用sort[rank]。在

# Setup
ids = np.array([22, 5, 4, 0, 100])
targets = np.array([5, 0])

sort = np.argsort(ids)
rank = np.searchsorted(ids, targets, sorter=sort)
print(sort[rank])
# array([1, 3])

我想我想出了个办法。在

我们可以构造一个'cipher'或排序:key = numpy.arange(len(ids))将初始排序器应用于该密钥,然后给出反向映射:revsort = key[np.argsort(ids)]


编辑:正如@birico指出的,key[sort]sort本身相同!在

>>> sort = np.argsort(ids)
>>> ids[sort]
[0,4,5,22,100]
>>> found = np.searchsorted(ids, targets, sorter=sort)
>>> found
[2,0]
>>> sort[found]
[1,3]

相关问题 更多 >

    热门问题