2012-10-10 16 views
5

Próbuję wektoryzować następującą operację. Mam tablicę odległości x, y, z i muszę znaleźć różnice między każdym z nich.Tablica 2D Numpy Odejmowanie według wiersza

temp_result = np.array([[0.8, 0., 1.], [0., -0.6, 1.],[0.8, 0., 1.]]) 

Co zamierzam zrobić, to odejmij bez użycia do iteracji pętli.

temp_result[0] - temp_result[0] 
temp_result[0] - temp_result[1] 
temp_result[0] - temp_result[2] 
temp_result[1] - temp_result[0] 
temp_result[1] - temp_result[1] 
temp_result[1] - temp_result[2] 
temp_result[2] - temp_result[0] 
temp_result[2] - temp_result[1] 
temp_result[2] - temp_result[2] 

dziękuję!

Odpowiedz

2

Oto miły podstęp Reshape opartej:

arr = temp_result 
diffs = arr[:,None,:] - arr[None,:,:] 

Wtedy różnica między wektor arr[i] i arr[j] znajduje się w diffs[i,j].

+1

Oto bardziej zwięzła wersja: 'diffs = arr [:, None] - arr [None,:]'. Jest to przykład możliwości transmisji numpy (http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html). –

+0

Korzystam już z nadawania; to, co tam zrobiłeś, polegało na niejawnym użyciu 'newaxis' (co jest miłym rozwiązaniem). Dodam to do odpowiedzi, dzięki! – nneonneo

+0

Przepraszam, nie chciałem sugerować, że nie korzystasz z nadawania! Oświadczenie to miało być ogólnym komentarzem do tej metody. –

0

Sprawdź scipy.spatial.distance, masz funkcje dla wszystkich na wszystkich dystansach.

+0

Szukałem zostać w bibliotece numpy. Jakieś wskazówki? – Fatoons