我发现
scipy.signal.fftconvolve,因为还马格努斯指出,但它的时候并没有意识到
ñ 维。由于它是内置的并且可以产生正确的值,因此它似乎是理想的解决方案。
查看scipy.signal.fftconvolve,signal.convolve和signal.correlate(有一个signal.correlate2d,但它似乎返回一个移位的数组,而不是居中)。
从2D卷积示例中:
In [1]: a = asarray([[ 1, 2, 3], ...: [ 4, 5, 6], ...: [ 7, 8, 9]])In [2]: b = asarray([[-1,-2,-1], ...: [ 0, 0, 0], ...: [ 1, 2, 1]])In [3]: scipy.signal.fftconvolve(a, b, mode = 'same')Out[3]: array([[-13., -20., -17.], [-18., -24., -18.], [ 13., 20., 17.]])
正确!另一方面,STSCI版本需要做一些额外的工作才能使边界正确吗?
In [4]: stsci.convolve2d(a, b, fft = True)Out[4]: array([[-12., -12., -12.], [-24., -24., -24.], [-12., -12., -12.]])
(STSCI方法还需要编译,但我不成功(我刚刚注释掉了非python部分),有一些类似这样的错误并修改了输入([1,2]变成[[1,2]]),等等。因此,我更改了对内置
fftconvolve()函数的接受答案。)
当然,相关与卷积是一样的,但是其中的一个输入相反:
In [5]: aOut[5]: array([[3, 0, 0], [2, 0, 0], [1, 0, 0]])In [6]: bOut[6]: array([[3, 2, 1], [0, 0, 0], [0, 0, 0]])In [7]: scipy.signal.fftconvolve(a, b[::-1, ::-1])Out[7]: array([[ 0., -0., 0., 0., 0.], [ 0., -0., 0., 0., 0.], [ 3., 6., 9., 0., 0.], [ 2., 4., 6., 0., 0.], [ 1., 2., 3., 0., 0.]])In [8]: scipy.signal.correlate2d(a, b)Out[8]: array([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [3, 6, 9, 0, 0], [2, 4, 6, 0, 0], [1, 2, 3, 0, 0]])
并且内部使用了2的幂次方加速了最新的修订版(然后我通过使用实数FFT作为实数输入并使用5平滑长度而不是2
:D的幂来加快了它的更新速度)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)