Numpy reshape 1d to 2d array with 1 column
You could do -
ar.reshape(ar.shape[0],-1)
That second input to reshape
: -1
takes care of the number of elements for the second axis. Thus, for a 2D
input case, it does no change. For a 1D
input case, it creates a 2D
array with all elements being "pushed" to the first axis because of ar.shape[0]
, which was the total number of elements.
Sample runs
1D Case :
In [87]: arOut[87]: array([ 0.80203158, 0.25762844, 0.67039516, 0.31021513, 0.80701097])In [88]: ar.reshape(ar.shape[0],-1)Out[88]: array([[ 0.80203158], [ 0.25762844], [ 0.67039516], [ 0.31021513], [ 0.80701097]])
2D Case :
In [82]: arOut[82]: array([[ 0.37684126, 0.16973899, 0.82157815, 0.38958523], [ 0.39728524, 0.03952238, 0.04153052, 0.82009233], [ 0.38748174, 0.51377738, 0.40365096, 0.74823535]])In [83]: ar.reshape(ar.shape[0],-1)Out[83]: array([[ 0.37684126, 0.16973899, 0.82157815, 0.38958523], [ 0.39728524, 0.03952238, 0.04153052, 0.82009233], [ 0.38748174, 0.51377738, 0.40365096, 0.74823535]])
To avoid the need to reshape in the first place, if you slice a row / column with a list, or a "running" slice, you will get a 2D array with one row / column
import numpy as npx = np.array(np.random.normal(size=(4,4)))print x, '\n'Result:[[ 0.01360395 1.12130368 0.95429414 0.56827029] [-0.66592215 1.04852182 0.20588886 0.37623406] [ 0.9440652 0.69157556 0.8252977 -0.53993904] [ 0.6437994 0.32704783 0.52523173 0.8320762 ]] y = x[:,[0]]print y, 'col vector \n'Result:[[ 0.01360395] [-0.66592215] [ 0.9440652 ] [ 0.6437994 ]] col vector y = x[[0],:]print y, 'row vector \n'Result:[[ 0.01360395 1.12130368 0.95429414 0.56827029]] row vector # Slice with "running" index on a columny = x[:,0:1]print y, '\n'Result:[[ 0.01360395] [-0.66592215] [ 0.9440652 ] [ 0.6437994 ]]
Instead if you use a single number for choosing the row/column, it will result in a 1D array, which is the root cause of your issue:
y = x[:,0]print y, '\n'Result:[ 0.01360395 -0.66592215 0.9440652 0.6437994 ]