Convolve: примеры (PYTHON)
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'.
Расширенные примеры применения
Фильтрация сигнала скользящим средним:
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()Вычисление взвешенного скользящего среднего (экспоненциальное сглаживание):
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]
Моделирование отклика линейной системы:
# Импульсная характеристика системы (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]
Свёртка для вычисления корреляции (поиск шаблона):
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