gpt4 book ai didi

python - Numpy 快速检查完整的数组相等性,如 Matlabs isequal

转载 作者:太空狗 更新时间:2023-10-29 21:46:17 25 4
gpt4 key购买 nike

在 Matlab 中,内置的 isequal 会检查两个数组是否相等。如果它们不相等,这可能会非常快,因为一旦存在差异,实现可能会立即停止检查:

>> A = zeros(1e9, 1, 'single');    
>> B = A(:);
>> B(1) = 1;
>> tic; isequal(A, B); toc;
Elapsed time is 0.000043 seconds.

Python/numpy 中是否有任何等效项? all(A==B)all(equal(A, B)) 慢得多,因为它比较所有元素,即使最初的不同:

In [13]: A = zeros(1e9, dtype='float32')                                                                                                                                                           

In [14]: B = A.copy()

In [15]: B[0] = 1

In [16]: %timeit all(A==B)
1 loops, best of 3: 612 ms per loop

是否有任何 numpy 等价物?它应该很容易在 C 中实现,但在 Python 中实现起来很慢,因为在这种情况下我们不想想要广播,所以它需要一个显式循环。

编辑:

array_equal 似乎符合我的要求。但是,它all(A==B) 快,因为它不是内置的,而只是一个执行A== 的短 Python 函数B。所以它不能满足我快速检查的需要。

In [12]: %timeit array_equal(A, B)
1 loops, best of 3: 623 ms per loop

最佳答案

首先,应该注意的是,在 OP 的示例中,数组具有相同的元素,因为 B=A[:] 只是数组的一个 View ,所以:

>>>  print A[0], B[0]
1.0, 1.0

但是,尽管该测试不合适,但基本的提示是正确的:Numpy 没有短路等效性检查。

the source可以很容易地看出allclosearray_equalarray_equiv 只是 all(A==B) 的变体以匹配他们各自的细节,并没有显着更快。

numpy 的一个优点是切片只是 View ,因此非常快,因此可以很容易地编写自己的短路比较(我并不是说这是理想的,但它确实有效):

from numpy import *

A = zeros(1e8, dtype='float32')
B = A[:]
B[0] = 1
C = array(B)
C[0] = 2
D = array(A)
D[-1] = 2

def short_circuit_check(a, b, n):
L = len(a)/n
for i in range(n):
j = i*L
if not all(a[j:j+L]==b[j:j+L]):
return False
return True


In [26]: %timeit short_circuit_check(A, C, 100) # 100x faster
1000 loops, best of 3: 1.49 ms per loop

In [27]: %timeit all(A==C)
1 loops, best of 3: 158 ms per loop

In [28]: %timeit short_circuit_check(A, D, 100)
10 loops, best of 3: 144 ms per loop

In [29]: %timeit all(A==D)
10 loops, best of 3: 160 ms per loop

关于python - Numpy 快速检查完整的数组相等性,如 Matlabs isequal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26260848/

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