Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要Python中的循环FFT卷积吗_Python_Scipy_Convolution - Fatal编程技术网

需要Python中的循环FFT卷积吗

需要Python中的循环FFT卷积吗,python,scipy,convolution,Python,Scipy,Convolution,我需要一个更快的模拟 scipy.signal.convolve2d(data, filter, boundary="wrap", mode="same") 你能告诉我如何更换它吗 p.S.scipy.signal.fftconvolve足够快,但它没有边界选项,我无法使其在循环卷积模式下工作。如果您计算以下内容: from scipy.fftpack import fft2, ifft2 f2 = ifft2(fft2(data, shape=data.shape) * fft2(filt

我需要一个更快的模拟

scipy.signal.convolve2d(data, filter, boundary="wrap", mode="same")
你能告诉我如何更换它吗


p.S.
scipy.signal.fftconvolve
足够快,但它没有
边界
选项,我无法使其在循环卷积模式下工作。

如果您计算以下内容:

from scipy.fftpack import fft2, ifft2

f2 = ifft2(fft2(data, shape=data.shape) * fft2(filter, shape=data.shape)).real
然后
f2
包含与
convolve2d(数据、过滤器、边界='wrap',模式='same')
相同的值,但这些值在每个轴上移动(“rolled”,用numpy术语)。(这是的应用程序。)

下面是一个简短的函数,它滚动结果以给出与
convolve2d
函数调用相同的结果:

def fftconvolve2d(x, y):
    # This assumes y is "smaller" than x.
    f2 = ifft2(fft2(x, shape=x.shape) * fft2(y, shape=x.shape)).real
    f2 = np.roll(f2, (-((y.shape[0] - 1)//2), -((y.shape[1] - 1)//2)), axis=(0, 1))
    return f2
比如说,

In [91]: data = np.random.rand(256, 256)

In [92]: filt = np.random.rand(16, 16)

In [93]: c2d = convolve2d(data, filt, boundary='wrap', mode='same')

In [94]: f2 = fftconvolve2d(data, filt)
验证结果是否相同:

In [95]: np.allclose(c2d, f2)
Out[95]: True
检查性能:

In [96]: %timeit c2d = convolve2d(data, filt, boundary='wrap', mode='same')
44.9 ms ± 77.3 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [97]: %timeit f2 = fftconvolve2d(data, filt)
5.23 ms ± 11.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

FFT版本要快得多(但请注意,我选择了
数据的维数为2的幂)。

如果您计算以下各项:

from scipy.fftpack import fft2, ifft2

f2 = ifft2(fft2(data, shape=data.shape) * fft2(filter, shape=data.shape)).real
然后
f2
包含与
convolve2d(数据、过滤器、边界='wrap',模式='same')
相同的值,但这些值在每个轴上移动(“rolled”,用numpy术语)。(这是的应用程序。)

下面是一个简短的函数,它滚动结果以给出与
convolve2d
函数调用相同的结果:

def fftconvolve2d(x, y):
    # This assumes y is "smaller" than x.
    f2 = ifft2(fft2(x, shape=x.shape) * fft2(y, shape=x.shape)).real
    f2 = np.roll(f2, (-((y.shape[0] - 1)//2), -((y.shape[1] - 1)//2)), axis=(0, 1))
    return f2
比如说,

In [91]: data = np.random.rand(256, 256)

In [92]: filt = np.random.rand(16, 16)

In [93]: c2d = convolve2d(data, filt, boundary='wrap', mode='same')

In [94]: f2 = fftconvolve2d(data, filt)
验证结果是否相同:

In [95]: np.allclose(c2d, f2)
Out[95]: True
检查性能:

In [96]: %timeit c2d = convolve2d(data, filt, boundary='wrap', mode='same')
44.9 ms ± 77.3 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [97]: %timeit f2 = fftconvolve2d(data, filt)
5.23 ms ± 11.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

FFT版本的速度要快得多(但请注意,我选择了
数据的维数为2的幂)。

我认为没有边界选项的原因是因为FFT不是那样工作的。你说的“循环”卷积到底是什么意思?编辑:没关系,我在上找到了一个定义。我认为没有边界选项的原因是FFT不能那样工作。你说的“循环”卷积到底是什么意思?编辑:没关系,我找到了一个定义。其中哪一个最初具有正确的有序输出?FFT版本或scipy conv warp版本?其中哪一个最初具有正确的有序输出?FFT版本还是scipy conv warp版本?