比较两个numpy数组

12 投票
4 回答
12839 浏览
提问于 2025-04-16 21:33

我有两个大小相同的numpy数组(它们的大小是48行365列),每个元素的值要么是-1,要么是0,要么是1。我想比较这两个数组,看看它们有多少个元素是相同的,多少个元素是不同的,同时要忽略那些至少有一个数组元素为0的情况,因为那代表没有数据。例如:

for x in range(48):
    for y in range(365):
        if array1[x][y] != 0:
            if array2[x][y] != 0:
                if array1[x][y] == array2[x][y]:
                    score = score + 1
                else:
                    score = score - 1
return score

这个过程花费的时间很长。我在想,能不能利用一个技巧,就是把两个数组的元素相乘,然后把所有的结果加起来,这样可能会得到相同的结果。我在寻找一个特别的numpy函数来帮助实现这个想法,但我不太确定还有哪些不常见的numpy函数可以用。

4 个回答

1

下面这些简单的计算可以帮助你选择最合适的方法来处理你的情况:

In []: A, B= randint(-1, 2, size= (48, 365)), randint(-1, 2, size= (48, 365))
In []: ignore= (0== A)| (0== B)
In []: valid= ~ignore

In []: (A[valid]== B[valid]).sum()
Out[]: 3841
In []: (A[valid]!= B[valid]).sum()
Out[]: 3849
In []: ignore.sum()
Out[]: 9830

确保这些计算是正确的:

In []: 3841+ 3849+ 9830== 48* 365
Out[]: True

所以你的 score(用这些随机值计算出来的)将会是:

In []: a, b= A[valid], B[valid]
In []: score= (a== b).sum()- (a!= b).sum()
In []: score
Out[]: -8
7

对我来说,最简单的方法就是这样做:

A = numpy.array()
B = numpy.array()

T = A - B
max = numpy.max(numpy.abs(T))

epsilon = 1e-6
if max > epsilon:
    raise Exception("Not matching arrays")

这样可以快速判断数组是否相同,还能比较浮点数的值!!

12

简单来说,不要去循环遍历。对一个numpy数组进行循环遍历是违背使用这个工具的初衷的。

ans = np.logical_and(
    np.logical_and(array1 != 0, array2 != 0),
    array1 == array2 )

这样做应该能得到正确的结果。

撰写回答