numpy.convolve#

numpy.convolve(a, v, mode='full')[источник]#

Возвращает дискретную, линейную свертку двух одномерных последовательностей.

Оператор свёртки часто встречается в обработке сигналов, где он моделирует влияние линейной стационарной системы на сигнал [1]. В теории вероятностей сумма двух независимых случайных величин распределена в соответствии со сверткой их индивидуальных распределений.

Если v длиннее, чем a, массивы меняются местами перед вычислением.

Параметры:
a(N,) array_like

Первый одномерный входной массив.

v(M,) array_like

Второй одномерный входной массив.

mode{'full', 'valid', 'same'}, опционально
‘full’:

По умолчанию режим — 'full'. Это возвращает свертку в каждой точке перекрытия с выходной формой (N+M-1,). На конечных точках свертки сигналы не перекрываются полностью, и могут наблюдаться граничные эффекты.

'same':

Режим 'same' возвращает вывод длиной max(M, N). Граничные эффекты всё ещё видны.

'valid':

Режим 'valid' возвращает вывод длиной max(M, N) - min(M, N) + 1. Произведение свертки дается только для точек, где сигналы полностью перекрываются. Значения за границами сигнала не оказывают эффекта.

Возвращает:
выходndarray

Дискретная, линейная свёртка a и v.

Смотрите также

scipy.signal.fftconvolve

Свертка двух массивов с использованием быстрого преобразования Фурье.

scipy.linalg.toeplitz

Используется для построения оператора свертки.

polymul

Умножение полиномов. Тот же вывод, что и у свертки, но также принимает объекты poly1d в качестве входных данных.

Примечания

Операция дискретной свёртки определяется как

\[(a * v)_n = \sum_{m = -\infty}^{\infty} a_m v_{n - m}\]

Можно показать, что свёртка \(x(t) * y(t)\) во времени/пространстве эквивалентна умножению \(X(f) Y(f)\) в частотной области, после соответствующего дополнения (дополнение необходимо для предотвращения циклической свертки). Поскольку умножение более эффективно (быстрее), чем свертка, функция scipy.signal.fftconvolve использует БПФ для вычисления свёртки больших наборов данных.

Ссылки

[1]

Википедия, "Свёртка", https://en.wikipedia.org/wiki/Convolution

Примеры

Обратите внимание, как оператор свертки переворачивает второй массив перед «скольжением» их друг по другу:

>>> import numpy as np
>>> np.convolve([1, 2, 3], [0, 1, 0.5])
array([0. , 1. , 2.5, 4. , 1.5])

Возвращать только средние значения свёртки. Содержит граничные эффекты, где нули учитываются:

>>> np.convolve([1,2,3],[0,1,0.5], 'same')
array([1. ,  2.5,  4. ])

Два массива имеют одинаковую длину, поэтому существует только одна позиция, где они полностью перекрываются:

>>> np.convolve([1,2,3],[0,1,0.5], 'valid')
array([2.5])