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)