2015-08-29 8 views
6

Próbuję dodać dwie tablice.Dodawanie macierzy 1-D do macierzy 3-D w Numpy

np.zeros((6,9,20)) + np.array([1,2,3,4,5,6,7,8,9]) 

chcę dostać coś, że jest jak

array([[[ 1., 1., 1., ..., 1., 1., 1.], 
     [ 2., 2., 2., ..., 2., 2., 2.], 
     [ 3., 3., 3., ..., 3., 3., 3.], 
     ..., 
     [ 7., 7., 7., ..., 7., 7., 7.], 
     [ 8., 8., 8., ..., 8., 8., 8.], 
     [ 9., 9., 9., ..., 9., 9., 9.]], 

     [[ 1., 1., 1., ..., 1., 1., 1.], 
     [ 2., 2., 2., ..., 2., 2., 2.], 
     [ 3., 3., 3., ..., 3., 3., 3.], 
     ..., 
     [ 7., 7., 7., ..., 7., 7., 7.], 
     [ 8., 8., 8., ..., 8., 8., 8.], 
     [ 9., 9., 9., ..., 9., 9., 9.]], 

więc dodawanie wpisów do każdej z matryc w odpowiedniej kolumnie. Wiem, że mogę zakodować to w jakiejś pętli, ale próbuję użyć bardziej eleganckiego/szybszego rozwiązania.

+0

Jaki musi być kształt tablicy wyjściowej? – Divakar

+0

Dla tego przykładu, musiałby zachować kształt macierzy 3-D, więc 6,9,20 – psh5017

+0

Nie otrzymasz wyniku takiego jak 'tablica ([[[1., 2., 3.,. .., 7, 8., 9.], ... 'o tym kształcie' (6,9,20) ', ponieważ ostatni wymiar pożądanej mocy wydaje się mieć 9 elementów, a nie 20. – Divakar

Odpowiedz

6

Można przynieść broadcasting do gry po powiększenia wymiarów drugiej tablicy z None lub np.newaxis, jak tak -

np.zeros((6,9,20))+np.array([1,2,3,4,5,6,7,8,9])[None,:,None] 
+0

Świetne! !! Dzięki!!!!!!!!!!!!!!! – psh5017

0

Można użyć płytki (ale trzeba także swapaxes aby uzyskać prawidłowy kształt) .

A = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) 
B = np.tile(A, (6, 20, 1)) 
C = np.swapaxes(B, 1, 2) 
4

Jeśli rozumiem zostanie poprawnie, najlepiej użyć jest NumPy's Broadcasting. Możesz dostać to, co chcesz, co następuje:

np.zeros((6,9,20))+np.array([1,2,3,4,5,6,7,8,9]).reshape((1,9,1)) 

Wolę używając reshape method użyciem notacji plasterka dla indeksów drogę Divakar pokazuje, bo robiłem uczciwej trochę pracy manipuluje kształty jak zmienne i trochę łatwiej jest omijać krotki w zmiennych niż plasterki. Można też robić rzeczy tak:

array1.reshape(array2.shape) 

Nawiasem mówiąc, jeśli jesteś naprawdę szuka czegoś tak prostego jak tablica, która biegnie od 0 do n-1 wzdłuż osi, sprawdź mgrid. Możesz uzyskać powyższe dane wyjściowe tylko z

np.mgrid[0:6,1:10,0:20][1]