Convolve: примеры (PYTHON)

Использование функции convolve в Python для обработки данных
Раздел: SciPy/OpenCV, Обработка сигналов/изображений
convolve(in1, in2, mode, method): ndarray

Описание функции convolve

Функция convolve реализует операцию свёртки для одномерных массивов. Она находится в модуле numpy и используется в областях цифровой обработки сигналов, анализа временных рядов и статистике для вычисления скользящего среднего, фильтрации сигналов и нахождения отклика линейной системы.

Основная форма вызова функции: numpy.convolve(a, v, mode='full').

Аргументы:

  • a (array_like) – первый одномерный входной массив.
  • v (array_like) – второй одномерный входной массив.
  • mode (str, необязательный) – определяет размер выходного массива:
    • 'full' (по умолчанию) – возвращает свёртку в каждой точке перекрытия. Размер вывода: len(a) + len(v) - 1.
    • 'same' – возвращает вывод такой же длины, как самый длинный входной массив, с центрированием результата.
    • 'valid' – возвращает свёртку только в тех точках, где массивы полностью перекрываются. Размер вывода: max(len(a), len(v)) - min(len(a), len(v)) + 1.

Возвращаемое значение:

Функция возвращает одномерный массив ndarray, содержащий дискретную линейную свёртку входных массивов a и v.

Простые примеры использования

Пример с режимом 'full':

import numpy as np
a = [1, 2, 3]
v = [0.5, 0.5]
result = np.convolve(a, v, mode='full')
print(result)
[0.5 1.5 2.5 1.5]

Пример с режимом 'same':

result = np.convolve(a, v, mode='same')
print(result)
[0.5 1.5 2.5]

Пример с режимом 'valid':

result = np.convolve(a, v, mode='valid')
print(result)
[1.5 2.5]

Свёртка с более длинным ядром:

a = [1, -1, 2]
v = [2, 1, 0, -1]
result = np.convolve(a, v, mode='full')
print(result)
[ 2 -1  3  1 -2 -2]

Похожие функции в Python

scipy.signal.convolve: поддерживает многомерные массивы и более широкий выбор режимов ('full', 'same', 'valid'). Рекомендуется для сложной обработки сигналов и изображений.

scipy.ndimage.convolve: предназначена для обработки N-мерных изображений, поддерживает различные граничные условия (например, постоянное заполнение, отражение). Используется в компьютерном зрении.

pandas.Series.rolling: применяется для вычисления скользящего окна в временных рядах с агрегирующими функциями (среднее, сумма). Удобна для анализа данных в DataFrame.

Выбор функции: numpy.convolve оптимальна для быстрых одномерных операций. scipy.signal.convolve подходит для многомерных задач. pandas.rolling используется при работе со структурированными временными рядами.

Аналоги функции в других языках

JavaScript (библиотека math.js):

const math = require('mathjs');
const result = math.convolve([1, 2, 3], [0.5, 0.5]);
console.log(result);
[0.5, 1.5, 2.5, 1.5]

Java (Apache Commons Math): Класс Convolution.

double[] a = {1, 2, 3};
double[] v = {0.5, 0.5};
double[] result = Convolution.convolve(a, v);

C# (MathNet.Numerics):

double[] a = {1, 2, 3};
double[] v = {0.5, 0.5};
double[] result = Convolve(a, v);

Golang (пользовательская реализация): Стандартная библиотека не содержит готовой функции, требуется ручная реализация алгоритма.

Отличия: В большинстве языков функция свёртки реализована во внешних математических библиотеках. В Python функция входит в состав numpy, что обеспечивает простоту использования и высокую производительность за счет векторных операций.

Типичные ошибки

1. Пустые входные массивы:

import numpy as np
np.convolve([], [1, 2])
ValueError: 'a' cannot be empty

2. Неправильный тип данных: Использование нечисловых типов вызывает ошибку.

np.convolve(['a', 'b'], [1, 2])
UFuncTypeError: ufunc 'multiply' did not contain a loop...

3. Неверный режим: Указание несуществующего режима.

np.convolve([1, 2], [3, 4], mode='incorrect')
ValueError: mode must be 'full', 'same', or 'valid'

4. Забывают, что операция не коммутативна при разных режимах: Режим 'same' зависит от порядка аргументов.

print(np.convolve([1,1,1], [0,1], mode='same'))
print(np.convolve([0,1], [1,1,1], mode='same'))
[0 1 2]
[1 1 0]

Изменения в последних версиях

В версии NumPy 1.17.0 в функцию convolve добавлена поддержка массивов с комплексными числами. Ранее поведение для комплексных чисел могло быть неопределенным.

Начиная с NumPy 1.20.0, улучшена обработка типов данных с плавающей точкой для повышения численной стабильности в пограничных случаях.

В NumPy 1.21.0 оптимизирована внутренняя реализация для больших массивов, что увеличило скорость выполнения на 10-15% для режимов 'full' и 'valid'.

Расширенные примеры применения

Фильтрация сигнала скользящим средним:

Пример python
import numpy as np
import matplotlib.pyplot as plt

# Создание зашумленного сигнала
t = np.linspace(0, 10, 100)
signal = np.sin(t) + np.random.normal(0, 0.2, 100)
# Ядро скользящего среднего (окно 5 точек)
kernel = np.ones(5) / 5
filtered = np.convolve(signal, kernel, mode='same')

# Визуализация
plt.plot(t, signal, alpha=0.5, label='Исходный')
plt.plot(t, filtered, 'r', label='Фильтрованный')
plt.legend()
plt.show()

Вычисление взвешенного скользящего среднего (экспоненциальное сглаживание):

Пример python
weights = np.exp(-np.linspace(0, 2, 10))
weights /= weights.sum()  # Нормализация
signal = np.random.randn(50)
smoothed = np.convolve(signal, weights, mode='same')
print(smoothed[:5])
[-0.278 -0.145 -0.089  0.126  0.321]

Моделирование отклика линейной системы:

Пример python
# Импульсная характеристика системы (RC-фильтр)
h = np.exp(-np.arange(0, 10, 0.5))
# Входной ступенчатый сигнал
x = np.zeros(50)
x[10:] = 1
# Выход системы
output = np.convolve(x, h, mode='full')[:len(x)]
print(output[9:12])
[0.    0.135 0.245]

Свёртка для вычисления корреляции (поиск шаблона):

Пример python
signal = np.array([0, 1, 2, 1, 0, -1, -2, -1, 0])
template = np.array([2, 1, 0])
corr = np.convolve(signal, template[::-1], mode='valid')
print('Позиция максимума:', np.argmax(corr))
Позиция максимума: 2

питон convolve function comments

En
Convolve Convolve two arrays