比较两个numpy数组

12

我有两个大小相同的numpy数组(它们恰好是48x365),每个元素都是-1、0或1。我想比较这两个数组,看看它们有多少次是相同的,有多少次是不同的,同时折扣掉所有至少有一个数组有零作为无数据的情况。例如:

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个回答

12

只需简单操作,不要迭代。 迭代numpy数组会破坏使用该工具的目的。

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

应该给出正确的解决方案。


好主意!但这给了我一个布尔数组。我仍然需要将所有True相加以获得分数。有没有一种numpy-thonic的方法来做到这一点? - Double AA
如果您只想求和,也可以使用 np.sum(array1[ans])np.sum(array2[ans])。每当有一个条目为“false”时,它将不计入值。 - ahelm

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")

它能够快速判断数组是否相同,并允许比较浮点数值!!


1
比起原帖所要求的更为通用的解决方案,但确实非常有用! - petr

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

因此,您的分数(使用这些随机值)将是:

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

0
import numpy as np

A = np.array()
B = np.array()
...
Z = np.array()

to_test = np.array([A, B, .., Z])

# compare linewise if all lines are equal 
np.all(map(lambda x: np.all(x==to_test[0,:]), to_test[1:,:]))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接