2013-01-23 25 views
25

consideri un array nella forma seguente (solo un esempio):Reshape una matrice in NumPy

[[ 0 1] 
[ 2 3] 
[ 4 5] 
[ 6 7] 
[ 8 9] 
[10 11] 
[12 13] 
[14 15] 
[16 17]] 

È forma è [9,2]. Ora voglio trasformare la matrice in modo che ogni colonna diventa una forma [3,3], in questo modo:

[[ 0 6 12] 
[ 2 8 14] 
[ 4 10 16]] 
[[ 1 7 13] 
[ 3 9 15] 
[ 5 11 17]] 

La soluzione più ovvia (e sicuramente "non divinatorio") è per inizializzare una matrice di zeri con la dimensione corretta ed eseguire due for-loops in cui sarà riempito con i dati. Sono interessato a una soluzione che è la lingua-conforme ...

risposta

40
a = np.arange(18).reshape(9,2) 
b = a.reshape(3,3,2).swapaxes(0,2) 

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


# b: 
array([[[ 0, 6, 12], 
     [ 2, 8, 14], 
     [ 4, 10, 16]], 

     [[ 1, 7, 13], 
     [ 3, 9, 15], 
     [ 5, 11, 17]]]) 
+15

Si noti che 'B' ora non è contiguo, il che significa che non può essere rimodellato in atto:' b.reshape (9, 2) ' restituisce una copia, non una vista degli stessi dati, e 'b.shape = (9, 2)' aumenterà ed errore. – Jaime

+3

Commento molto molto importante di @Jaime, poiché il punto di forma è consentire il ridimensionamento ottimistico senza un clone. Grande affare con enormi set di dati – deepelement

Problemi correlati