为何np.convolve卷积结果信号偏移1位?附复现代码
解决卷积结果偏移的问题
我明白你的问题了:你期望当X0的峰值(第6个元素,0-based索引5)和rbf_kernel的峰值(同样是第6个元素)对齐时,卷积结果的最大值出现在同一位置,但实际用np.convolve(X0, rbf_kernel, mode='same')得到的结果偏移了。
问题根源
np.convolve()函数实现的是数学上的卷积操作,它会先翻转核(rbf_kernel),再进行滑动相乘求和。而你想要的是互相关操作——也就是不翻转核,直接滑动对齐两个信号的峰值,此时当峰值重合时求和结果最大。
你的rbf_kernel并不是对称数组(第一个元素是2.40369476e-04,最后一个是4.82794999e-03),所以翻转后的核的峰值位置会发生变化,最终导致卷积结果的峰值偏移。
解决方案
有两种简单的方法可以得到你期望的结果:
方法1:使用互相关函数(推荐)
直接用scipy.signal.correlate(),它默认执行互相关操作,不需要翻转核:
import numpy as np from scipy import signal X0 = np.array([0., 0., 0., 0., 0., 1., 0., 0., 0., 0.]) rbf_kernel = np.array([2.40369476e-04, 4.82794999e-03, 4.97870684e-02, 2.63597138e-01, 7.16531311e-01, 1.00000000e+00, 7.16531311e-01, 2.63597138e-01, 4.97870684e-02, 4.82794999e-03]) # 执行互相关,mode='same'保证输出长度和输入一致 result = signal.correlate(X0, rbf_kernel, mode='same')
这样得到的result的最大值会出现在X0峰值的位置(0-based索引5),和你的预期一致。
方法2:手动翻转核后做卷积
因为互相关等价于“输入和翻转后的核做卷积”,所以你可以先翻转rbf_kernel,再用np.convolve():
import numpy as np X0 = np.array([0., 0., 0., 0., 0., 1., 0., 0., 0., 0.]) rbf_kernel = np.array([2.40369476e-04, 4.82794999e-03, 4.97870684e-02, 2.63597138e-01, 7.16531311e-01, 1.00000000e+00, 7.16531311e-01, 2.63597138e-01, 4.97870684e-02, 4.82794999e-03]) # 先翻转核,再做卷积 result = np.convolve(X0, np.flip(rbf_kernel), mode='same')
np.flip()会翻转核的顺序,np.convolve()再执行一次翻转(卷积的要求),两次翻转后相当于使用原核做互相关,最终结果和方法1一致。
验证
如果你运行上述任意一种方法,都会得到result[5] = 1.0(0-based索引5),也就是X0峰值的位置,完全符合你的预期。
内容的提问来源于stack exchange,提问作者rando
相关产品推荐
相关产品推荐

