numpy con python: convierte un array 3d a 2d

Digamos que tengo una imagen en color y, naturalmente, esto se representará mediante una matriz tridimensional en python, por ejemplo, de forma (nxmx 3) y llámelo img.

Quiero una nueva matriz 2-d, llámela “narray” para tener una forma (3, nxm), de modo que cada fila de esta matriz contenga la versión “aplanada” de los canales R, G y B, respectivamente. Además, debería tener la propiedad que puedo reconstruir fácilmente cualquiera de los canales originales por algo como

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

La pregunta es ¿cómo puedo construir el “narray” de “img”? El img.reshape simple (3, -1) no funciona ya que el orden de los elementos no es deseable para mí.

Gracias

    np.transpose usar np.transpose para reorganizar las dimensiones. Ahora, nxmx 3 se convertirá a 3 x (n*m) , así que envíe el último eje al frente y desplace a la derecha el orden de los ejes restantes (0,1) . Finalmente, remodelar para tener 3 filas. Así, la implementación sería –

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

    Ejecución de la muestra

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

    Digamos que tenemos una matriz img de tamaño mxnx 3 para transformar en una matriz new_img de tamaño 3 x (m*n)

     new_img = img.reshape((img.shape[0]*img.shape[1]), img.shape[2]) new_img = new_img.transpose() 

    Si tiene instalado el módulo scikit, puede usar el rgb2grey (o rgb2gray) para hacer una foto de color a gris (de 3D a 2D)

    desde skimage import io, color

    lina_color = io.imread (ruta + img) lina_gray = color.rgb2gray (lina_color)

    En [33]: lina_color.shape Out [33]: (1920, 1280, 3)

    En [34]: lina_gray.shape Out [34]: (1920, 1280)