Функция convolve
Функция convolve вычисляет дискретную свертку двух одномерных массивов.
Первым параметром передается массив a, вторым - массив v.
Третьим параметром можно задать режим свертки: 'full', 'same' или 'valid'.
Режим определяет размер выходного массива. Функция возвращает одномерный массив свертки.
Синтаксис
np.convolve(a, v, mode='full')
Параметры функции:
- a - первый одномерный массив (сигнал);
- v - второй одномерный массив (ядро свертки);
- mode - необязательный строковый параметр, определяющий размер вывода:
- 'full' - полная свертка (по умолчанию);
- 'same' - результат той же длины, что и массив a;
- 'valid' - только те точки, где массивы полностью перекрываются.
Пример с режимом 'full'
Выполним полную свертку двух массивов:
import numpy as np
a = np.array([1, 2, 3])
v = np.array([4, 5, 6])
res = np.convolve(a, v, mode='full')
print(res)
Результат выполнения кода:
[ 4 13 28 27 18]
В режиме 'full' выходная длина равна len(a) + len(v) - 1.
Пример с режимом 'same'
Получим свертку той же длины, что и первый массив:
import numpy as np
a = np.array([1, 2, 3, 4, 5])
v = np.array([1, 0, -1])
res = np.convolve(a, v, mode='same')
print(res)
Результат выполнения кода:
[ 2 2 2 2 -4]
Режим 'same' часто используется для фильтрации сигналов.
Пример с режимом 'valid'
Выполним свертку только для полностью перекрывающихся частей:
import numpy as np
a = np.array([1, 2, 3, 4, 5])
v = np.array([1, 0, 1])
res = np.convolve(a, v, mode='valid')
print(res)
Результат выполнения кода:
[ 4 6 8]
Выходная длина в режиме 'valid' равна len(a) - len(v) + 1.
Пример применения в скользящем среднем
Сгладим сигнал с помощью свертки с ядром усреднения:
import numpy as np
signal = np.array([10, 12, 11, 13, 15, 14, 16])
window = np.ones(3) / 3
smoothed = np.convolve(signal, window, mode='same')
print(smoothed)
Результат выполнения кода:
[11. 11. 12. 13. 14.
15. 10.66666667]
Полученный массив - сглаженная версия исходного сигнала.
Пример с разными типами данных
Функция поддерживает массивы с целыми и вещественными числами:
import numpy as np
a = np.array([1.5, 2.5, 3.5])
v = np.array([0.5, 0.5])
res = np.convolve(a, v, mode='full')
print(res)
Результат выполнения кода:
[0.75 2. 3. 1.75]