2015-08-29 19 views
6

Sto tentando di aggiungere due array.Aggiunta di una matrice 1-D a una matrice 3D in Numpy

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

voglio ottenere qualcosa che è come

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.]], 

Così l'aggiunta di voci a ciascuna delle matrici alla colonna corrispondente. So che posso codificarlo in un ciclo di qualche tipo, ma sto cercando di usare una soluzione più elegante/più veloce.

+0

Quale deve essere la forma di matrice di output? – Divakar

+0

Per questo esempio, sarebbe necessario mantenere la forma della matrice 3-D, quindi 6,9,20 – psh5017

+0

Non si otterrà un output come 'array ([[[1., 2., 3.,. .., 7., 8., 9.], ... 'con quella forma' (6,9,20) ', perché l'ultima dimensione nell'output desiderato sembra avere 9 elementi e non 20. – Divakar

risposta

6

È possibile portare broadcasting in gioco dopo l'estensione delle dimensioni del secondo array con None o np.newaxis, in questo modo -

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

Grande !! !! Grazie!!!!!!!!!!!!!!! – psh5017

0

Si potrebbe utilizzare piastrelle (ma si sarebbe anche bisogno swapaxes per ottenere la forma corretta) .

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

Se ho capito bene, la cosa migliore da usare è NumPy's Broadcasting. È possibile ottenere ciò che si desidera con il seguente:

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

io preferisco usare la reshape method all'utilizzo fetta notazione per gli indici il modo Divakar mostra, perché ho fatto un bel po 'di lavoro di manipolare forme come variabili, e è un po 'più facile passare le tuple in variabili che in slice. È anche possibile fare cose come questa:

array1.reshape(array2.shape) 

A proposito, se siete veramente alla ricerca di qualcosa di semplice come un array che va da 0 a N-1 lungo un asse, controlla mgrid. È possibile ottenere l'output sopra con solo

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