2011-07-14 73 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:,:]))