numpy.convolve#

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

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

卷积运算符常用于信号处理中,它模拟了线性时不变系统对信号的影响 [1]。在概率论中,两个独立随机变量的和是根据它们各自分布的卷积来分布的。

如果 v 的长度大于 a,则在计算前会交换这两个数组。

参数:
a(N,) 数组形式

第一个一维输入数组。

v(M,) 数组形式

第二个一维输入数组。

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

默认情况下,模式为 ‘full’。它返回每个重叠点的卷积,输出形状为 (N+M-1,)。在卷积的端点处,信号不会完全重叠,可能会出现边界效应。

‘same’

模式 ‘same’ 返回长度为 max(M, N) 的输出。边界效应仍然可见。

‘valid’

模式 ‘valid’ 返回长度为 max(M, N) - min(M, N) + 1 的输出。卷积结果仅针对信号完全重叠的点给出。信号边界之外的值没有影响。

返回:
outndarray

av 的离散线性卷积。

另请参阅

scipy.signal.fftconvolve

使用快速傅里叶变换对两个数组进行卷积。

scipy.linalg.toeplitz

用于构造卷积运算符。

polymul

多项式乘法。与 convolve 的输出相同,但也可以接受 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]

维基百科,“卷积”,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])