比较两个numpy数组
我有两个大小相同的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 )
这样做应该能得到正确的结果。