我有一个很大(数百万)的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]
。
答案 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)