2011-07-14 10 views
10

Mam dwie identyczne tablice o tej samej wielkości (są to 48x365), gdzie każdy element ma wartość -1, 0 lub 1. Chcę porównać te dwa i zobaczyć, ile razy są one zarówno te same, jak i ile razy są różne, dyskontując wszystkie czasy, w których co najmniej jedna z tablic ma zero jako brak danych. Na przykład:Porównanie dwóch niezliczonych tablic ze sobą

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 

Zajmuje to bardzo dużo czasu. Myślałem, aby wykorzystać fakt, że pomnożenie elementów razem i zsumowanie wszystkich odpowiedzi może dać taki sam wynik, i szukam specjalnej funkcji numpy, aby pomóc w tym. Nie jestem do końca pewien, jakie niezwykłe funkcje są dostępne.

Odpowiedz

12

Simpy nie iteruj. Iteracja po tablicy numpy pokonuje cel użycia tego narzędzia.

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

powinien podać poprawne rozwiązanie.

+0

Dobry pomysł! Ale to daje mi tablicę boolowską. Nadal muszę podsumować wszystkie True's, aby uzyskać wynik. Czy istnieje sposób na numpie-thonic? –

+1

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

+0

możesz także użyć 'np.sum (array1 [ans])' lub 'np.sum (array2 [ans])' jeśli chcesz sumować sam. za każdym razem, gdy masz wpis "false", nie bierze on pod uwagę wartości. – ahelm

0

prostych obliczeń wzdłuż następujących linii, pomoże Ci wybrać najodpowiedniejszy sposób, aby obsługiwać swoje sprawy:

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 

Zapewnienie, że obliczenia są poprawne:

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

Dlatego swój score (z tymi wartościami losowymi) będzie:

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

Fo r mnie Najłatwiej jest to zrobić:

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

To pozwoli szybko wiedzieć, czy tablice są takie same i pozwalają na porównanie wartości pływaka !!

+1

Nieco bardziej ogólne rozwiązanie niż OP, ale bardzo przydatne! – 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:,:]))