python - 检查两个 numpy 数组是否相同

标签 python numpy

假设我有一堆数组,包括xy,我想检查它们是否相等。通常,我可以只使用 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/

相关文章:

python - 使用 Numpy 替换任意轴上的值

python - 对称矩阵及其转置的逻辑比较

numpy - np.maximum.accumulate 具有 nan 值

java - Java 和 Python 的最佳 GUI 工具包/框架

python - 类型错误 : ufunc 'add' did not contain a loop with signature matching types dtype ('S23' ) dtype ('S23' ) dtype ('S23' )

python - 使用 `is (CustomClass)` 可以安全地检测 Python 中的未初始化值

numpy - 澄清 Theano 中的 flatten 函数

python - 将 Python/Numpy 代码转换为 Cython - 数组问题 - 缓冲区类型仅允许作为函数局部变量?

python - 使用 python 请求在 HTTP POST 上规避错误 414

python - "how to print multiple user inputs on one line"