What does "ValueError: object too deep for desired array" mean and how to fix it?
Solution 1
The Y array in your screenshot is not a 1D array, it's a 2D array with 300 rows and 1 column, as indicated by its shape being (300, 1).
To remove the extra dimension, you can slice the array as Y[:, 0]. To generally convert an n-dimensional array to 1D, you can use np.reshape(a, a.size).
Another option for converting a 2D array into 1D is flatten() function from numpy.ndarray module, with the difference that it makes a copy of the array.
Solution 2
np.convolve() takes one dimension array. You need to check the input and convert it into 1D.
You can use the np.ravel(), to convert the array to one dimension.
Solution 3
You could try using scipy.ndimage.convolve it allows convolution of multidimensional images. here is the docs
Solution 4
np.convolve needs a flattened array as one of it's inputs, you can use numpy.ndarray.flatten() which is quite fast, find it here.
Olivier_s_j
Updated on July 13, 2022Comments
-
Olivier_s_j 11 monthsI'm trying to do this:
h = [0.2, 0.2, 0.2, 0.2, 0.2] Y = np.convolve(Y, h, "same")Ylooks like this:
While doing this I get this error:
ValueError: object too deep for desired arrayWhy is this?
My guess is because somehow the
convolvefunction does not seeYas a 1D array. -
lib over 8 yearsTo convert that array to 1D array, you can also use squeeze() -
Ari over 3 yearsEven simpler (and more accurate), instead of len(a) use: a.size -
user4815162342 over 3 years@Ari Why more accurate?sizeis documented to return the number of elements in the array, which seems to me like the exact same thing aslen()returns. -
Ari over 3 yearslen(a) gives the "length" along one axis only. For multi-dimensional arrays (2D and above) it is better to use 'size'. -
user4815162342 over 3 years@Ari Oh, now I see what you mean:sizeis the product of lengths across dimensions. Usinga.sizemakes the recipe correctly reshape arrays with more than two dimensions, where usinglenwould fail with "total size of new array must be unchanged". Thanks for the hint, I've now updated the answer. -
LudvigH over 2 years.squeeze()is probably the most correct choice in this situation.