我有两个大小相等的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功能。
答案 0 :(得分:12)
Simpy不迭代。迭代一个numpy数组会破坏使用该工具的目的。
ans = np.logical_and(
np.logical_and(array1 != 0, array2 != 0),
array1 == array2 )
应该给出正确的解决方案。
答案 1 :(得分:6)
对我来说,最简单的方法就是这样做:
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")
它允许快速了解数组是否相同并允许比较浮点值!!
答案 2 :(得分:0)
以下几行的简单计算将帮助您选择最适合处理案例的方法:
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
答案 3 :(得分: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:,:]))