2011-07-14 331 views
10

Tengo dos matrices numpy de igual tamaño (que son 48x365) donde cada elemento es -1, 0 o 1. Quiero comparar las dos y ver cuántas veces son tanto lo mismo y cuántas veces son diferentes mientras se descuentan todas las veces en que al menos una de las matrices tiene un cero como no hay datos. Por ejemplo:Comparando dos matrices numpy entre sí

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 

Esto lleva mucho tiempo. Estaba pensando en aprovechar el hecho de que multiplicar los elementos juntos y sumar todas las respuestas puede dar el mismo resultado, y estoy buscando una función numpy especial para ayudar con eso. No estoy seguro de qué función numpy inusual hay por ahí.

Respuesta

12

Simpy no iterar. La iteración sobre una matriz numpy derrota el propósito de usar la herramienta.

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

debería dar la solución correcta.

+0

¡Buena idea! Pero esto me da una matriz booleana. Todavía necesito resumir todos los True para obtener una puntuación. ¿Hay una manera numpy-thonic para hacer eso? –

+1

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

+0

también puede usar 'np.sum (array1 [ans])' o 'np.sum (array2 [ans])' si desea sumar por sí mismo. cada vez que tenga un 'falso' como entrada, no tendrá en cuenta el valor. – ahelm

0

cálculos sencillos a lo largo de las siguientes líneas, le ayudará a seleccionar el modo más adecuado para manejar su 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 

Asegurar que los cálculos son válidos:

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

lo tanto, su score (con estos valores aleatorios) sería:

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

Fo r mí la forma más fácil es hacer esto:

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

Se permite saber rápidamente si las matrices son los mismos y permitir comparar los valores de coma flotante !!

+1

¡Una solución un poco más general que la OP solicitada pero muy útil de hecho! – 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:,:])) 
Cuestiones relacionadas