2012-12-21 9 views
22

Ich habe eine 3D-Matrix wie diese3d Numpy Array bis 2d

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

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

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

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

und möchte sie in Rasterformat stapeln, enden mit

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

Gibt es eine Möglichkeit, ohne explizit zu tun hstacking (und/oder vstacking) sie oder Hinzufügen einer zusätzlichen Dimension und Umformung (nicht sicher, das würde funktionieren)?

Danke,

+0

Zeigen Sie uns Ihren Code. – tostao

Antwort

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

Ich habe für reshaping/unshaping arrays into blocks, here allgemeinere Funktionen geschrieben.

+15

Erstaunt von dieser Meisterschaft von NumPy. :) – EOL

+0

Ok, wenn man bedenkt, dass ich N Blockmatrizen mit 'bm x bn' Dimension habe und sie in einer 'mxn' Matrix stapeln möchte, vorausgesetzt' N = mxn', dann hätte ich dann 'x.reshape (m, n, bm, bn) .swapaxes (1,2) .reshape (bm * m, -1) ' Ich wollte nur wissen, ob es für diesen Zweck irgendeine numpy Funktion gab. Danke @unutbu noch einmal. – poeticcapybara

+1

@EOL: Danke, EOL, aber wenn du gesehen hast [was hinter den Kulissen passiert ist] (http://www.youtube.com/watch?v=sY_Yf4zz-yo), war es nicht so schön :) – unutbu