2011-07-14 101 views
10

我有两个大小相同的numpy数组(它们恰好是48x365),其中每个元素都是-1,0或1.我想比较两者并查看它们是多少次都是相同的,并且它们有多少次是不同的,同时将至少其中一个数组具有零的所有时间作为无数据的折扣。例如:比较两个numpy数组彼此

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功能。

回答

12

Simpy不会迭代。迭代数组会破坏使用该工具的目的。

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

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

+0

好主意!但是这给了我一个布尔数组。我仍然需要总结所有的真正的得分。是否有一种颠覆性的方式来做到这一点? –

+1

当然。 'np.sum(ans)' – Paul

+0

如果你想自己求和,你也可以使用'np.sum(array1 [ans])'或'np.sum(array2 [ans])'。每次你有一个“假”作为条目,它都不会考虑到这个值。 – ahelm

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 
6

Fo我最简单的方法是这样做:

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

比OP要求的更通用的解决方案,但确实非常有用! – petr

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:,:]))