2015-07-28 13 views
6

Esiste un modo per suddividere e rimodellare un array 2D in uno 3D. Il seguente esempio:Numpy - Risagoma e suddivide l'array 2D in 3D

enter image description here

Fondamentalmente, ho una matrice 4x4 sulla sinistra e voglio una matrice 2x2x4 nel modo mostrato, in modo che posso applicare numpy.mean al 3 ° asse. In realtà la matrice che ho è davvero enorme, ecco perché il loop sui blocchi non è un'opzione.

Qualsiasi aiuto è molto apprezzato.

+3

Correlati: http://stackoverflow.com/q/16856788/190597 – unutbu

+0

Grazie. Applicare la media due volte sull'asse 1 con il metodo su quella pagina ha funzionato. – Auxiliary

+1

Un'altra versione correlata per mettere quei blocchi come colonne: http://stackoverflow.com/questions/30109068/implement-matlabs-im2col-sliding-in-python. Semplifica le operazioni che potresti desiderare di bloccare a mano in senso vettoriale operando in seguito sull'asse 0-esimo. – Divakar

risposta

2

Per l'esempio, è possibile utilizzare numpy.lib.stride_tricks.as_strided.

In [1]: A = np.arange(16).reshape(4, 4) 

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

In [3]: strides = A.itemsize * np.array([8, 2, 4, 1]) 

In [4]: x = p.lib.stride_tricks.as_strided(A, shape = (2, 2, 2, 2), strides = strides) 

In [4]: x 
Out[4]: 
array([[[[ 0, 1], 
     [ 4, 5]], 

     [[ 2, 3], 
     [ 6, 7]]], 


     [[[ 4, 5], 
     [ 8, 9]], 

     [[ 6, 7], 
     [10, 11]]]]) 

In [5]: x.reshape(4, 2, 2) 
Out[5]: 
array([[[ 0, 1], 
     [ 4, 5]], 

     [[ 2, 3], 
     [ 6, 7]], 

     [[ 8, 9], 
     [12, 13]], 

     [[10, 11], 
     [14, 15]]]) 

I passi definiscono offset in byte da utilizzare quando attraversano la matrice, e la funzione as_strided consente di creare un nuovo array con passi dall'utente definire.

Tuttavia, non so quanto sia efficiente e quanto bene si ridimensionerà per il vostro uso.