2012-12-21 32 views
22

Mam matrycowego 3D jak ten3d tablica Numpy do 2d

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

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

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

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

i chciałby układać je w formie siatki, kończąc

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

Czy istnieje sposób to zrobić bez wyraźnego hstacking (i/lub vstacking) lub dodanie dodatkowego wymiaru i zmiany kształtu (nie wiesz, czy to zadziała)?

Dzięki,

+0

Pokaż nam swój kod. – tostao

Odpowiedz

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

ja pisał funkcje bardziej ogólnych dla reshaping/unshaping arrays into blocks, here.

+15

Zaskoczony tym opanowaniem NumPy. :) – EOL

+0

Ok, więc biorąc pod uwagę mam N macierzy blokowych z wymiarem 'bm x bn' i chcę je ułożyć w macierzy' mxn', pod warunkiem 'N = mxn', wtedy będę miał ' x.reshape (m, n, bm, bn) .swapaxes (1,2) .reshape (bm * m, -1) ' Chciałam tylko wiedzieć, czy istnieje funkcja numpy do tego celu. Dzięki @unutbu jeszcze raz. – poeticcapybara

+1

@EOL: Dziękuję, EOL, ale jeśli widziałeś [co działo się za kulisami] (http://www.youtube.com/watch?v=sY_Yf4zz-yo), to nie było takie ładne :) – unutbu