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

时间:2015-04-14 19:50:39

标签: python algorithm sorting search numpy

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

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

然后我想要结果:

>>> [1,3]

如果我对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]

但是如何才能找到 reverse 映射到'unsort'这个结果?即将[2,0]的已排序条目映射回原来的位置:[1,3]

4 个答案:

答案 0 :(得分:6)

有一些答案已经围绕这个跳舞,但只是为了说清楚你需要做的就是使用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])

答案 1 :(得分:2)

你能这样做吗?

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

可替换地:

np.hstack([np.where(ids==x)[0] for x in targets])

都给出了:

array([1, 3])

答案 2 :(得分:1)

我想我已经想出了一些东西。

我们可以构建一个'密码'或排序: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]

答案 3 :(得分:0)

你可以在这里使用broadcasting作为单行 -

_,out = np.where(np.array(ids)==np.array(targets)[:,None])

示例运行 -

In [20]: ids
Out[20]: [22, 5, 4, 0, 100]

In [21]: targets
Out[21]: [0, 22, 5]

In [22]: _,out = np.where(np.array(ids)==np.array(targets)[:,None])

In [23]: out
Out[23]: array([3, 0, 1], dtype=int64)