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