2011-07-14 17 views
10

Ho due array numpy uguali (sono 48x365) dove ogni elemento è -1, 0 o 1. Voglio confrontare i due e vedere quante volte sono sia lo stesso sia quante volte sono diversi mentre si attualizzano tutte le volte in cui almeno uno degli array ha zero come nessun dato. Ad esempio:Confronto tra due array numpy l'uno con l'altro

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 

Questo richiede molto tempo. Stavo pensando di sfruttare il fatto che moltiplicare gli elementi insieme e sommare tutte le risposte può dare lo stesso risultato, e sto cercando una funzione speciale numpy per aiutare con quello. Non sono davvero sicuro di quale insolita funzione numpy ci sia.

risposta

12

Simpy non itera. L'iterazione su una matrice numpy vanifica lo scopo dell'utilizzo dello strumento.

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

dovrebbe dare la soluzione corretta.

+0

Buona idea! Ma questo mi dà una matrice booleana. Devo ancora riassumere tutti i True per ottenere un punteggio. C'è un modo spettrale per farlo? –

+1

sicuro. 'np.sum (ans)' – Paul

+0

puoi anche usare 'np.sum (array1 [ans])' o 'np.sum (array2 [ans])' se vuoi sommare da solo. ogni volta che si ha un 'falso' come una voce non si tiene conto del valore. – ahelm

0

Semplici calcoli lungo le seguenti linee, vi aiuterà a scegliere il modo più adatto per gestire il vostro caso:

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 

Garantire che i calcoli sono validi:

In []: 3841+ 3849+ 9830== 48* 365 
Out[]: True 

Pertanto tua score (con questi valori casuali) sarebbe:

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

r me il modo più semplice è quello di fare questo:

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

Permette di sapere rapidamente se gli array sono gli stessi e permettono di confrontare valori float !!

+1

Una soluzione un po 'più generale di quella richiesta dall'OP ma davvero molto utile! – 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:,:]))