ValueError: объект слишком глубокий для желаемого массива при использовании свертки

Я пытаюсь это сделать:

h = [0.2,0.2,0.2,0.2,0.2]

Y = np.convolve(Y, h, "same")

Y выглядит так:

скриншот

При этом я получаю эту ошибку:

ValueError: object too deep for desired array

Почему это?

Я предполагаю, что почему-то функция convolve не видит Y как одномерный массив.


person Olivier_s_j    schedule 10.04.2013    source источник


Ответы (4)


Массив Y на вашем снимке экрана не является одномерным массивом, это двумерный массив с 300 строками и 1 столбцом, на что указывает его shape, равный (300, 1).

Чтобы удалить лишнее измерение, вы можете разрезать массив как Y[:, 0]. Чтобы обычно преобразовать n-мерный массив в 1D, вы можете использовать np.reshape(a, a.size).

Другой вариант преобразования 2D-массива в 1D - это функция flatten() из модуля numpy.ndarray, с той разницей, что она делает копию массива.

person user4815162342    schedule 10.04.2013
comment
Чтобы преобразовать этот массив в одномерный массив, вы также можете использовать squeeze () - person lib; 19.02.2015
comment
Еще проще (и точнее) вместо len (a) использовать: a.size - person Ari; 15.01.2020
comment
@Ari Почему точнее? size задокументирован для возврата количества элементов в массиве, что, как мне кажется, похоже на то, что возвращает len(). - person user4815162342; 15.01.2020
comment
len (a) дает длину только по одной оси. Для многомерных массивов (2D и выше) лучше использовать size. - person Ari; 21.01.2020
comment
@Ari О, теперь я понимаю, что вы имеете в виду: size - это произведение длины на размеры. Использование a.size позволяет рецепту правильно изменять форму массивов с более чем двумя измерениями, где использование len приведет к сбою, так как общий размер нового массива должен быть неизменным. Спасибо за подсказку, теперь я обновил ответ. - person user4815162342; 21.01.2020
comment
.squeeze() - наверное, самый правильный выбор в данной ситуации. - person LudvigH; 12.01.2021

np.convolve() принимает одномерный массив. Вам нужно проверить ввод и преобразовать его в 1D.

Вы можете использовать np.ravel(), чтобы преобразовать массив в одно измерение.

person Sandip Kumar    schedule 19.06.2017

Вы можете попробовать использовать scipy.ndimage.convolve, он позволяет свертку многомерных изображений. здесь документация

person jelde015    schedule 11.01.2019

np.convolve требуется плоский массив в качестве одного из входов, вы можете использовать numpy.ndarray.flatten(), что довольно быстро, найдите его здесь.

person NoSuchUserException    schedule 09.06.2018