Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ValueError: all the input arrays must have same number of dimensions

I'm having a problem with np.append.

I'm trying to duplicate the last column of 20x361 matrix n_list_converted by using the code below:

n_last = []
n_last = n_list_converted[:, -1]
n_lists = np.append(n_list_converted, n_last, axis=1)

But I get error:

ValueError: all the input arrays must have same number of dimensions

However, I've checked the matrix dimensions by doing

 print(n_last.shape, type(n_last), n_list_converted.shape, type(n_list_converted))

and I get

(20L,) (20L, 361L)

so the dimensions match? Where is the mistake?

like image 630
odo22 Avatar asked Aug 09 '16 10:08

odo22


People also ask

How do you concatenate two arrays of different sizes Python?

You can either reshape it array_2. reshape(-1,1) , or add a new axis array_2[:,np. newaxis] to make it 2 dimensional before concatenation.

How do I use Vstack in Python?

The vstack() function is used to stack arrays in sequence vertically (row wise). This is equivalent to concatenation along the first axis after 1-D arrays of shape (N,) have been reshaped to (1,N). The arrays must have the same shape along all but the first axis. 1-D arrays must have the same length.

What is Numpy R_?

r_ = <numpy.lib.index_tricks.RClass object> Translates slice objects to concatenation along the first axis. This is a simple way to build up arrays quickly. There are two use cases. If the index expression contains comma separated arrays, then stack them along their first axis.


3 Answers

If I start with a 3x4 array, and concatenate a 3x1 array, with axis 1, I get a 3x5 array:

In [911]: x = np.arange(12).reshape(3,4) In [912]: np.concatenate([x,x[:,-1:]], axis=1) Out[912]:  array([[ 0,  1,  2,  3,  3],        [ 4,  5,  6,  7,  7],        [ 8,  9, 10, 11, 11]]) In [913]: x.shape,x[:,-1:].shape Out[913]: ((3, 4), (3, 1)) 

Note that both inputs to concatenate have 2 dimensions.

Omit the :, and x[:,-1] is (3,) shape - it is 1d, and hence the error:

In [914]: np.concatenate([x,x[:,-1]], axis=1) ... ValueError: all the input arrays must have same number of dimensions 

The code for np.append is (in this case where axis is specified)

return concatenate((arr, values), axis=axis) 

So with a slight change of syntax append works. Instead of a list it takes 2 arguments. It imitates the list append is syntax, but should not be confused with that list method.

In [916]: np.append(x, x[:,-1:], axis=1) Out[916]:  array([[ 0,  1,  2,  3,  3],        [ 4,  5,  6,  7,  7],        [ 8,  9, 10, 11, 11]]) 

np.hstack first makes sure all inputs are atleast_1d, and then does concatenate:

return np.concatenate([np.atleast_1d(a) for a in arrs], 1) 

So it requires the same x[:,-1:] input. Essentially the same action.

np.column_stack also does a concatenate on axis 1. But first it passes 1d inputs through

array(arr, copy=False, subok=True, ndmin=2).T 

This is a general way of turning that (3,) array into a (3,1) array.

In [922]: np.array(x[:,-1], copy=False, subok=True, ndmin=2).T Out[922]:  array([[ 3],        [ 7],        [11]]) In [923]: np.column_stack([x,x[:,-1]]) Out[923]:  array([[ 0,  1,  2,  3,  3],        [ 4,  5,  6,  7,  7],        [ 8,  9, 10, 11, 11]]) 

All these 'stacks' can be convenient, but in the long run, it's important to understand dimensions and the base np.concatenate. Also know how to look up the code for functions like this. I use the ipython ?? magic a lot.

And in time tests, the np.concatenate is noticeably faster - with a small array like this the extra layers of function calls makes a big time difference.

like image 195
hpaulj Avatar answered Sep 19 '22 16:09

hpaulj


(n,) and (n,1) are not the same shape. Try casting the vector to an array by using the [:, None] notation:

n_lists = np.append(n_list_converted, n_last[:, None], axis=1)

Alternatively, when extracting n_last you can use

n_last = n_list_converted[:, -1:]

to get a (20, 1) array.

like image 32
Aguy Avatar answered Sep 21 '22 16:09

Aguy


The reason why you get your error is because a "1 by n" matrix is different from an array of length n.

I recommend using hstack() and vstack() instead. Like this:

import numpy as np
a = np.arange(32).reshape(4,8) # 4 rows 8 columns matrix.
b = a[:,-1:]                    # last column of that matrix.

result = np.hstack((a,b))       # stack them horizontally like this:
#array([[ 0,  1,  2,  3,  4,  5,  6,  7,  7],
#       [ 8,  9, 10, 11, 12, 13, 14, 15, 15],
#       [16, 17, 18, 19, 20, 21, 22, 23, 23],
#       [24, 25, 26, 27, 28, 29, 30, 31, 31]])

Notice the repeated "7, 15, 23, 31" column. Also, notice that I used a[:,-1:] instead of a[:,-1]. My version generates a column:

array([[7],
       [15],
       [23],
       [31]])

Instead of a row array([7,15,23,31])


Edit: append() is much slower. Read this answer.

like image 34
RuRo Avatar answered Sep 18 '22 16:09

RuRo