Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't reshape numpy array

I have a function that is supposed to take a 1D array of integers and shapes it into a 2D array of 1x3 arrays. It then is supposed to take each 1x3 array and shift it into a 3x1 array. The result is supposed to be a 2D array of 3x1 arrays. Here is my function

def RGBtoLMS(rgbValues, rgbLength): #Method to convert from RGB to LMS
    print rgbValues
    lmsValues = rgbValues.reshape(-1, 3)
    print lmsValues
    for i in xrange(len(lmsValues)):
        lmsValues[i] = lmsValues[i].reshape(3, 1)

    return lmsValues

The issue rises when I try to change the 1x3 arrays to 3x1 arrays. I get the following output assuming rgbValues = [14, 25, 19, 24, 25, 28, 58, 87, 43]

[14 25 19 ..., 58 87 43]
[[14 25 19]
 [24, 25, 28]
 [58 87 43]]

ValueError [on line lmsValues[i] = lmsValues[i].reshape(3, 1)]: could not broadcast input array from shape (3,1) into shape (3)

How can I avoid this error?

like image 619
Nick Gilbert Avatar asked Nov 27 '13 21:11

Nick Gilbert


People also ask

Why do we do reshape (- 1 1?

If you have an array of shape (2,4) then reshaping it with (-1, 1), then the array will get reshaped in such a way that the resulting array has only 1 column and this is only possible by having 8 rows, hence, (8,1).

Is there reshape method in NumPy?

The numpy. reshape() function allows us to reshape an array in Python. Reshaping basically means, changing the shape of an array. And the shape of an array is determined by the number of elements in each dimension.

Which NumPy method is used to change the shape of array?

Reshaping means changing the shape of an array. The shape of an array is the number of elements in each dimension. By reshaping we can add or remove dimensions or change number of elements in each dimension.


1 Answers

As mentioned in the comments, you are really always just modifying one array with different shapes. It doesn't really make sense in numpy to say that you have a 2d array of 1 x 3 arrays. What that really is is actually a n x 3 array.

We start with a 1d array of length 3*n (I've added three numbers to your example to make the difference between a 3 x n and n x 3 array clear):

>>> import numpy as np

>>> rgbValues = np.array([14, 25, 19, 24, 25, 28, 58, 87, 43, 1, 2, 3])
>>> rgbValues.shape
(12,)

And reshape it to be n x 3:

>>> lmsValues = rgbValues.reshape(-1, 3)
>>> lmsValues
array([[14, 25, 19],
       [24, 25, 28],
       [58, 87, 43],
       [ 1,  2,  3]])
>>> lmsValues.shape
(4, 3)

If you want each element to be shaped 3 x 1, maybe you just want to transpose the array. This switches rows and columns, so the shape is 3 x n

>>> lmsValues.T
array([[14, 24, 58,  1],
       [25, 25, 87,  2],
       [19, 28, 43,  3]])

>>> lmsValues.T.shape
(3, 4)

>>> lmsValues.T[0]
array([14, 24, 58,  1])

>>> lmsValues.T[0].shape
(4,)

If you truly want each element in lmsValues to be a 1 x 3 array, you can do that, but then it has to be a 3d array with shape n x 1 x 3:

>>> lmsValues = rgbValues.reshape(-1, 1, 3)
>>> lmsValues
array([[[14, 25, 19]],

       [[24, 25, 28]],

       [[58, 87, 43]],

       [[ 1,  2,  3]]])

>>> lmsValues.shape
(4, 1, 3)

>>> lmsValues[0]
array([[14, 25, 19]])

>>> lmsValues[0].shape
(1, 3)
like image 59
askewchan Avatar answered Oct 06 '22 18:10

askewchan