Python numpy.convolve函数方法的使用

numpy.convolve 函数用于在两个一维数组之间执行卷积操作。卷积在信号处理、图像处理和许多其他领域中有广泛的应用。本文主要介绍一下NumPy中convolve方法的使用。

numpy.convolve

numpy.convolve(a, v, mode='full') [source]

返回两个一维序列的离散线性卷积。

卷积算子在信号处理中经常见到,它在信号上模拟了线性时不变系统的效果[1]。在概率论中,两个独立随机变量之和是根据它们各自分布的卷积分布的。

如果v大于a,则在计算之前交换数组。

参数:

a :(N,) array_like

第一个一维输入数组。

v :(M,) array_like

第二个一维输入数组。

out :array, 可选

mode{‘full’, ‘valid’, ‘same’}, 可选

1) ‘full’:

默认情况下,模式为'full'

这将在每个重叠点返回卷积,

输出形状为(N + M-1,)。在卷积的端点,

信号没有完全重叠,并且可以看到边界效应。

2) ‘same’:

模式‘same’返回长度max(M, N)的输出。

边界效果仍然可见。

3) ‘valid’:

模式 ‘valid’返回长度max(M, N) - min(M, N) + 1的输出 。

卷积仅针对信号完全重叠的点给出。

信号边界之外的值无效。

返回值:

outndarray

a和v的离散线性卷积。

Notes

离散卷积运算定义为


可以证明,在适当的填充之后


时间/空间的卷积等于


傅立叶域中的乘法(必须填充以防止循环卷积)。

由于乘法比卷积更有效(更快),

因此该函数scipy.signal.fftconvolve利用FFT来计算大数据集的卷积。

参考文献

[1]Wikipedia,“Convolution”, https://en.wikipedia.org/wiki/Convolution

例子

请注意,卷积运算符如何翻转第二个数组,然后才将它们 “sliding” 在一起:

>>> 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])

1)卷积的模式

卷积模式:'full'、'valid' 和 'same'。每种模式产生的输出长度和特性不同。

import numpy as np

# 定义两个一维数组
a = np.array([1, 2, 3])
v = np.array([0, 1, 0.5])

# 'full' 模式
result_full = np.convolve(a, v, mode='full')
print("Full convolution:", result_full)

# 'valid' 模式
result_valid = np.convolve(a, v, mode='valid')
print("Valid convolution:", result_valid)

# 'same' 模式
result_same = np.convolve(a, v, mode='same')
print("Same convolution:", result_same)

2)移动平均滤波器

移动平均滤波器是信号处理中常用的一种简单滤波方法,可以通过卷积操作实现。

import numpy as np

# 生成一个随机信号
signal = np.random.rand(10)

# 定义移动平均滤波器的窗口
window = np.ones(3) / 3

# 计算移动平均
smoothed_signal = np.convolve(signal, window, mode='valid')

print("Original signal:", signal)
print("Smoothed signal:", smoothed_signal)

推荐阅读
cjavapy编程之路首页