numpy.convolve#
- numpy.convolve(a, v, mode='full')[源代码]#
返回两个一维序列的离散线性卷积.
卷积运算符在信号处理中经常见到,它模拟了线性时不变系统对信号的影响 [1].在概率论中,两个独立随机变量的和根据它们各自分布的卷积分布.
如果 v 比 a 长,则在计算前交换数组.
- 参数:
- a(N,) array_like
第一个一维输入数组.
- v(M,) array_like
第二个一维输入数组.
- mode{‘full’, ‘valid’, ‘same’}, 可选
- ‘full’:
默认情况下,模式是 ‘full’.这会在每个重叠点返回卷积,输出形状为 (N+M-1,).在卷积的端点,信号没有完全重叠,可能会看到边界效应.
- ‘same’:
模式 ‘same’ 返回长度为
max(M, N)
的输出.边界效应仍然可见.- ‘有效’
模式 ‘valid’ 返回长度为
max(M, N) - min(M, N) + 1
的输出.卷积积仅在信号完全重叠的点给出.信号边界外的值没有影响.
- 返回:
- outndarray
离散的、线性的 a 和 v 的卷积.
参见
scipy.signal.fftconvolve
使用快速傅里叶变换卷积两个数组.
scipy.linalg.toeplitz
用于构造卷积运算符.
polymul
多项式乘法.输出与卷积相同,但也接受 poly1d 对象作为输入.
备注
离散卷积运算定义为
\[(a * v)_n = \sum_{m = -\infty}^{\infty} a_m v_{n - m}\]可以证明,在时间/空间中的卷积 \(x(t) * y(t)\) 等价于傅里叶域中的乘积 \(X(f) Y(f)\) ,在适当的填充之后(填充是防止循环卷积所必需的).由于乘法比卷积更高效(更快),函数
scipy.signal.fftconvolve
利用FFT来计算大数据集的卷积.参考文献
[1]Wikipedia, “卷积”, https://en.wikipedia.org/wiki/Convolution
示例
注意卷积运算符如何在将第二个数组”滑动”到另一个数组之前翻转它:
>>> import numpy as np >>> 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])