对于大型数组(n>;1e8),是否有比np.isin
更快的方法来检查是否存在相同的元素
我试过几种方法,比如pandasisin
,cython,但所有这些都比np.isin
花费更多的时间
示例:(测试一维数组的每个元素是否也存在于第二个数组中)
num = int(1e8)
a = np.random.rand(int(num))
b = np.random.rand(int(num))
ref=time.time()
ainb = np.isin(a,b)
print(a[ainb])
print(time.time()-ref,'sec')
>>> [0.23591019 0.46102523]
>>> 65.45570135116577 sec
我不确定这是否适合您的需要,但是集合的交集(
&
)看起来更快。缺点是你只会得到元素,而不是它们的索引交叉口的计时设置:
计时
np.isin()
:如果您需要一个下拉列表(针对您的用例),但可能需要更快地替换
np.isin()
,那么您可以使用Pythonset()
进行检查,并加速Numba中的显式循环:请注意,有一些(便宜的)额外代码可以使其适用于N-dim阵列,如果您只需要1D,则可以省略这些代码
通过添加进一步的并行化,甚至可以加快速度:
这比
np.isin()
、set()
交叉点和is_in_set()
无加速的解决方案快得多:输入大小为1000万个元素:
并且有一亿个元素(最后两种方法最终填满了所有内存,因此被省略):
为较小的输入添加更多计时,但所有长度组合为
a
和b
:这表明Numba和并行化对于较大的输入非常有益,而对于较小的输入则效率稍低。 然而,在上述大多数测试中,他们仍然优于
np.isin()
相关问题 更多 >
编程相关推荐