numpy.convolve
numpy.convolve(a, v, mode='full') [source]
返回两个一维序列的离散线性卷积。
卷积算子在信号处理中经常见到,它在信号上模拟了线性时不变系统的效果[1]。在概率论中,两个独立随机变量之和是根据它们各自分布的卷积分布的。
如果v大于a,则在计算之前交换数组。
参数: | a :(N,) array_like 第一个一维输入数组。 v :(M,) array_like 第二个一维输入数组。 out : mode: 1) ‘full’: 默认情况下,模式为 这将在每个重叠点返回卷积, 输出形状为 信号没有完全重叠,并且可以看到边界效应。 2) ‘same’: 模式 边界效果仍然可见。 3) ‘valid’: 模式 卷积仅针对信号完全重叠的点给出。 信号边界之外的值无效。 |
返回值: | out :ndarray 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)