假设我有一堆数组,包括x
和y
,我想检查它们是否相等。通常,我可以只使用 np.all(x == y)
(除了一些我现在忽略的愚蠢的极端情况)。
然而,这会计算(x == y)
的整个 数组,这通常是不需要的。我的数组真的很大,我有很多,两个数组相等的概率很小,所以十有八九,我真的只需要计算 (x == y) 的很小一部分
在 all
函数可能返回 False 之前,所以这对我来说不是最佳解决方案。
我已经尝试使用内置的 all
函数,结合 itertools.izip
:all(val1==val2 for val1,val2 in itertools. izip(x, y))
但是,在两个数组 相等的情况下,这似乎要慢得多,总的来说,它仍然不值得在 np.all
上使用。我推测是因为内置 all
的通用性。 np.all
不适用于生成器。
有没有办法更快地完成我想做的事情?
我知道这个问题与之前提出的问题(例如 Comparing two numpy arrays for equality, element-wise)类似,但它们特别不涵盖提前终止的情况。
最佳答案
在 numpy 原生实现之前,您可以编写自己的函数并使用 numba 对其进行 jit 编译。 :
import numpy as np
import numba as nb
@nb.jit(nopython=True)
def arrays_equal(a, b):
if a.shape != b.shape:
return False
for ai, bi in zip(a.flat, b.flat):
if ai != bi:
return False
return True
a = np.random.rand(10, 20, 30)
b = np.random.rand(10, 20, 30)
%timeit np.all(a==b) # 100000 loops, best of 3: 9.82 µs per loop
%timeit arrays_equal(a, a) # 100000 loops, best of 3: 9.89 µs per loop
%timeit arrays_equal(a, b) # 100000 loops, best of 3: 691 ns per loop
最坏情况下的性能(数组相等)相当于 np.all
并且在提前停止的情况下,编译函数有可能比 np.all
好很多。
关于python - 检查两个 numpy 数组是否相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43973991/