2015-09-29 16 views
7

Dire che ho un'immagine a colori, e naturalmente questa sarà rappresentata da una matrice tridimensionale in python, per esempio di forma (n x m x 3) e chiamarla img.numpy con python: convertire l'array 3d in 2d

Voglio un nuovo array 2-d, chiamarlo "narray" per avere una forma (3, nxm), tale che ogni riga di questo array contenga rispettivamente la versione "appiattita" dei canali R, G e B . Inoltre, si dovrebbe avere la proprietà che posso facilmente ricostruire indietro qualsiasi canale originale da qualcosa come

narray[0,].reshape(img.shape[0:2]) #so this should reconstruct back the R channel. 

La domanda è: come posso costruire il "narray" di "img"? Il semplice img.reshape (3, -1) non funziona in quanto l'ordine degli elementi non è desiderabile per me.

Grazie

risposta

8

è necessario utilizzare np.transpose per riorganizzare le dimensioni. Ora, n x m x 3 deve essere convertito in 3 x (n*m), quindi inviare l'ultimo asse in avanti e spostare a destra l'ordine degli assi rimanenti (0,1). Infine, rimodellare per avere righe 3. Così, l'attuazione sarebbe -

img.transpose(2,0,1).reshape(3,-1) 

Campione run -

In [16]: img 
Out[16]: 
array([[[155, 33, 129], 
     [161, 218, 6]], 

     [[215, 142, 235], 
     [143, 249, 164]], 

     [[221, 71, 229], 
     [ 56, 91, 120]], 

     [[236, 4, 177], 
     [171, 105, 40]]]) 

In [17]: img.transpose(2,0,1).reshape(3,-1) 
Out[17]: 
array([[155, 161, 215, 143, 221, 56, 236, 171], 
     [ 33, 218, 142, 249, 71, 91, 4, 105], 
     [129, 6, 235, 164, 229, 120, 177, 40]]) 
+0

grazie! Mai pensato di applicare np.transpose a un array tridimensionale .. – wudanao

+0

@Divakar: Ho una domanda molto simile: http://stackoverflow.com/questions/35302361/reshape-an-array-of-images –

+0

I I è necessario utilizzare anche la trasposizione? Sembra che io abbia bisogno di [155, 33, 129, 161, 218, 6], ecc. Invece di [155, 161, 215, 143, 221, 56, 236, 171]. –