2012-12-21 31 views
22

Ho una matrice 3d simili3d matrice Numpy a 2d

arange(16).reshape((4,2,2)) 
array([[[ 0, 1], 
     [ 2, 3]], 

     [[ 4, 5], 
     [ 6, 7]], 

     [[ 8, 9], 
     [10, 11]], 

     [[12, 13], 
     [14, 15]]]) 

e vorrebbe impilarle in formato griglia, finendo con

array([[ 0, 1, 4, 5], 
     [ 2, 3, 6, 7], 
     [ 8, 9, 12, 13], 
     [10, 11, 14, 15]]) 

C'è un modo di fare a meno esplicitamente hstacking (e/o vstacking) o aggiungendo una dimensione extra e rimodellamento (non è sicuro che ciò funzionerebbe)?

Grazie,

+0

Mostraci il tuo codice. – tostao

risposta

35
In [27]: x = np.arange(16).reshape((4,2,2)) 

In [28]: x.reshape(2,2,2,2).swapaxes(1,2).reshape(4,-1) 
Out[28]: 
array([[ 0, 1, 4, 5], 
     [ 2, 3, 6, 7], 
     [ 8, 9, 12, 13], 
     [10, 11, 14, 15]]) 

ho postato funzioni più generali per reshaping/unshaping arrays into blocks, here.

+15

Stupito da questa maestria di NumPy. :) – EOL

+0

Ok, quindi considerando che ho matrici di blocchi N con dimensione 'bm x bn' e voglio impilarle in una matrice' mxn', fornita 'N = mxn', avrei quindi ' x.reshape (m, n, bm, bn) .swapaxes (1,2) .risposta (bm * m, -1) ' Volevo solo sapere se c'era una funzione numpy per questo scopo. Grazie ancora @unutbu. – poeticcapybara

+1

@EOL: Grazie, EOL, anche se hai visto [cosa è successo dietro le quinte] (http://www.youtube.com/watch?v=sY_Yf4zz-yo), non è stato così carino :) – unutbu