gpt4 book ai didi

python - 如果大数组包含较小数组中的值,则查找大数组的索引

转载 作者:太空狗 更新时间:2023-10-30 00:31:44 25 4
gpt4 key购买 nike

是否有一个快速的 numpy 函数可以返回一个较大数组中的索引列表,它与较小数组中的值相匹配?较小的数组是 ~ 30M 值,较大的是 800M,所以我想避免 numpy.where 调用的 for 循环。

searchsorted 的问题是它会返回结果,即使它们不是完全匹配,它只给出最接近的索引,但我只想要完全匹配的索引

而不是这个:

>>> a = array([1,2,3,4,5])
>>> b = array([2,4,7])
>>> searchsorted(a,b)
array([1, 3, 5])

我想要这个:

>>> a = array([1,2,3,4,5])
>>> b = array([2,4,7])
>>> SOMEFUNCTION(a,b)
array([1, 3])

编辑:较小和较大数组中的值集始终是唯一且已排序的。

最佳答案

你可以使用 np.in1d找到 ab 中的那些元素。要查找索引,请调用一次 np.where :

In [34]: a = array([1,2,3,4,5])

In [35]: b = array([2,4,7])

In [36]: np.in1d(a, b)
Out[38]: array([False, True, False, True, False], dtype=bool)

In [39]: np.where(np.in1d(a, b))
Out[39]: (array([1, 3]),)

因为 ab 已经排序,你可以使用

In [57]: np.searchsorted(b, a, side='right') != np.searchsorted(b, a, side='left')
Out[57]: array([False, True, False, True, False], dtype=bool)

而不是 np.in1d(a, b)。对于较大的 ab,使用 searchsorted 可能更快:

import numpy as np
a = np.random.choice(10**7, size=10**6, replace=False)
a.sort()
b = np.random.choice(10**7, size=10**5, replace=False)
b.sort()

In [53]: %timeit np.in1d(a, b)
10 loops, best of 3: 176 ms per loop

In [54]: %timeit np.searchsorted(b, a, side='right') != np.searchsorted(b, a, side='left')
10 loops, best of 3: 106 ms per loop

JaimeDivakar对上面显示的方法提出了一些重大改进。下面是一些测试方法是否都返回相同结果的代码,后面是一些基准测试:

import numpy as np

a = np.random.choice(10**7, size=10**6, replace=False)
a.sort()
b = np.random.choice(10**7, size=10**5, replace=False)
b.sort()

def using_searchsorted(a, b):
return (np.where(np.searchsorted(b, a, side='right')
!= np.searchsorted(b, a, side='left')))[0]

def using_in1d(a, b):
return np.where(np.in1d(a, b))[0]

def using_searchsorted_divakar(a, b):
idx1 = np.searchsorted(a,b,'left')
idx2 = np.searchsorted(a,b,'right')
out = idx1[idx1 != idx2]
return out

def using_jaime_mask(haystack, needle):
idx = np.searchsorted(haystack, needle)
mask = idx < haystack.size
mask[mask] = haystack[idx[mask]] == needle[mask]
idx = idx[mask]
return idx

expected = using_searchsorted(a, b)
for func in (using_in1d, using_searchsorted_divakar, using_jaime_mask):
result = func(a, b)
assert np.allclose(expected, result)

In [29]: %timeit using_jaime_mask(a, b)
100 loops, best of 3: 13 ms per loop

In [28]: %timeit using_searchsorted_divakar(a, b)
10 loops, best of 3: 21.7 ms per loop

In [26]: %timeit using_searchsorted(a, b)
10 loops, best of 3: 109 ms per loop

In [27]: %timeit using_in1d(a, b)
10 loops, best of 3: 173 ms per loop

关于python - 如果大数组包含较小数组中的值,则查找大数组的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31789187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com