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 months
I'm trying to do this:
h = [0.2, 0.2, 0.2, 0.2, 0.2] Y = np.convolve(Y, h, "same")
Y
looks like this:While doing this I get this error:
ValueError: object too deep for desired array
Why is this?
My guess is because somehow the
convolve
function does not seeY
as 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?
size
is 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:
size
is the product of lengths across dimensions. Usinga.size
makes the recipe correctly reshape arrays with more than two dimensions, where usinglen
would 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.