繁体   English   中英

元素indeces的矢量化搜索

[英]Vectorized search of element indeces

我有两个整数numpy数组,比如arr1arr2 ,它们是range(some_length)排列range(some_length)

我想得到第三个,在哪里

所有idx = 0,1,2,..., some_length-1 arr3[idx] = arr1.get_index_of(arr2[idx])

这里get_index_of method是获取集合中某个元素的索引的伪方法。

这可以通过所有indeces的朴素循环,搜索对应的元素以及随后的索引索引等来完成。

但那很慢 - O(n ^ 2)。 可以更快地完成(至少n * log(n)复杂度)? 可以通过漂亮的numpy方法完成吗? 也许用非平凡key=参数进行一些排序? 当然有一些优雅的解决方案。

先感谢您。

比方说, a0..9排列

>>> a = np.random.permutation(10)
>>> a
array([3, 7, 1, 8, 2, 4, 6, 0, 9, 5])

那么, 索引器数组是:

>>> i = np.empty(len(a), dtype='i8')
>>> i[a] = np.arange(len(a))
>>> i
array([7, 2, 4, 0, 5, 9, 6, 1, 3, 8])

这意味着, a 0索引是i[0] == 7 ,这是真的,因为a[7] == 0

因此,在您的示例中,假设您有一个额外的向量b ,您可以执行以下操作:

>>> b
array([5, 9, 4, 8, 6, 1, 7, 2, 3, 0])
>>> i[b]
array([9, 8, 5, 3, 6, 2, 1, 4, 0, 7])

这意味着,比如说, b[0] == 5和索引5ai[b][0] == 9 ,这是真实的,因为a[9] = 5 = b[0]

让我们试一下测试用例

In [166]: arr1=np.random.permutation(10)
In [167]: arr2=np.random.permutation(10)
In [168]: arr1
Out[168]: array([4, 3, 2, 9, 7, 8, 5, 1, 6, 0])
In [169]: arr2
Out[169]: array([9, 2, 6, 4, 0, 3, 1, 7, 8, 5])

np.where(arr1==i)执行你的get_index_of method ,所以你的迭代解决方案是:

In [170]: np.array([np.where(arr1==i)[0] for i in arr2]).flatten()
Out[170]: array([3, 2, 8, 0, 9, 1, 7, 4, 5, 6], dtype=int32)

矢量化方法是在2个阵列之间进行“外部”比较。 这会生成一个(10,10)数组,我们可以将where应用于获取索引的位置。 仍然是O(n ^ 2)方法,但它主要是编译的。 在这个问题的大小,它快5倍。

In [171]: np.where(arr1==arr2[:,None])
Out[171]: 
(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int32),
 array([3, 2, 8, 0, 9, 1, 7, 4, 5, 6], dtype=int32))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM