numpy.convolve
numpy.convolve(a, v, mode='full')
Функция convolve() возвращает дискретную линейную свертку двух одномерных последовательностей.
Массивы a
и v
не обязаны быть одинаковой длинны, но если массив v
длиннее чем a
, то перед началом вычислений они меняются местами.
-
- a, v - массивы или подобные массивам объекты
- Входные массивы с длиннами (N,) и (M,) соответственно (N и M могут быть как равны, так и нет).
- mode - {‘full’, ‘valid’, ‘same’}, необязательный параметр
- Определяет режим вычисления линейной свертки:
- ‘full’
- Режим установленный по умолчанию. В данном режиме функция вычисляет свертку в каждой точке перекрытия, а длина выходного массива будет равна (N + M - 1,). На краях свертки массивы могут перекрываться не полностью, что вызывает граничные эффекты.
- ‘valid’
- Возвращает массив длинны
max(N, M)
, при этом так же наблюдаются граничные эффекты. - ‘same’
- Свертка вычисляетя только в точках с перекрытием сигналов, поэтому граничные эффекты не возникают. Длина результирующего массива определяется как
max(N,M) - min(N, M) + 1
-
- результат - массив NumPy
- Дискретную линейную свертку массивов a и v.
Замечание
Дискретная линейная свертка очень часто необходима при работе с сигналами или случайными величинами. Вычисляется свертка двух сигналов по формуле:
$$(a\ast v)\lbrack n\rbrack=\sum_{m=-\infty}^\infty a\lbrack m\rbrack v\lbrack n-m\rbrack$$
Если вы вычисляете свертку больших наборов данных, то целесообразнее использовать функцию scipy.signal.fftconvolve
.
Свёртка последовательностей - https://ru.wikipedia.org/wiki/Свёртка_последовательностей
Примеры
>>> import numpy as np
>>>
>>> a = np.array([0, 1, 2, 3, 2, 1, 0])
>>> v = np.array([1, 2, 2.7, 2.9, 1, 2, 2.7])
>>>
>>> # Обеспечим вывод массивов целиком:
... np.set_printoptions(threshold=np.nan)
>>>
>>> np.convolve(a, b)
array([ 0. , 1. , 4. , 9.7, 16.3, 19.9, 20.1, 18.2, 16.3, 13.1, 7.4,
2.7, 0. ])
>>>
>>> np.convolve(a, b, mode = 'same')
array([ 9.7, 16.3, 19.9, 20.1, 18.2, 16.3, 13.1])
>>>
>>> np.convolve(a, b, mode = 'valid')
array([20.1])