Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

numpy with python: convert 3d array to 2d

Say that I have a color image, and naturally this will be represented by a 3-dimensional array in python, say of shape (n x m x 3) and call it img.

I want a new 2-d array, call it "narray" to have a shape (3,nxm), such that each row of this array contains the "flattened" version of R,G,and B channel respectively. Moreover, it should have the property that I can easily reconstruct back any of the original channel by something like

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

The question is how can I construct the "narray" from "img"? The simple img.reshape(3,-1) does not work as the order of the elements are not desirable for me.

Thanks

like image 829
wudanao Avatar asked Sep 29 '15 08:09

wudanao


People also ask

How do you reshape an array from 3D to 2D in Python?

reshape() function to convert a 3D array with dimensions (4, 2, 2) to a 2D array with dimensions (4, 4) in Python. In the above code, we first initialize a 3D array arr using numpy. array() function and then convert it into a 2D array newarr with numpy. reshape() function.


1 Answers

You need to use np.transpose to rearrange dimensions. Now, n x m x 3 is to be converted to 3 x (n*m), so send the last axis to the front and shift right the order of the remaining axes (0,1). Finally , reshape to have 3 rows. Thus, the implementation would be -

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

Sample 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]]) 
like image 176
Divakar Avatar answered Oct 09 '22 08:10

Divakar