What does "ValueError: object too deep for desired array" mean and how to fix it?

125,732

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.

Share:
125,732
Olivier_s_j
Author by

Olivier_s_j

Updated on July 13, 2022

Comments

  • Olivier_s_j
    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:

    screenshot

    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 see Y as a 1D array.

  • lib
    lib over 8 years
    To convert that array to 1D array, you can also use squeeze()
  • Ari
    Ari over 3 years
    Even simpler (and more accurate), instead of len(a) use: a.size
  • user4815162342
    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 as len() returns.
  • Ari
    Ari over 3 years
    len(a) gives the "length" along one axis only. For multi-dimensional arrays (2D and above) it is better to use 'size'.
  • user4815162342
    user4815162342 over 3 years
    @Ari Oh, now I see what you mean: size is the product of lengths across dimensions. Using a.size makes the recipe correctly reshape arrays with more than two dimensions, where using len would fail with "total size of new array must be unchanged". Thanks for the hint, I've now updated the answer.
  • LudvigH
    LudvigH over 2 years
    .squeeze() is probably the most correct choice in this situation.