我有一个形状为(100000,256,256)的3d numpy数组,我想在2d数组的每个堆栈上做FFT,这意味着要进行100000次FFT。在
我已经测试了速度的单一和堆叠的数据与最低代码以下。在
import numpy as np
a = np.random.random((256, 256))
b = np.random.random((10, 256, 256))
%timeit np.fft.fft2(a)
%timeit np.fft.fftn(b, axes=(1, 2,))
得出如下结论:
872 µs ± 19.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
6.46 ms ± 227 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
10万次fft需要一分钟以上的时间。在
有没有更快的方法可以同时进行多个fft或ifft?
更新: 经过一番搜索,我找到了cupy,这似乎有帮助。在
在Python中处理FFT时,CuPy是我的首选包。在处理大尺寸fft时,它有绝对惊人的性能,再加上多次迭代。当然,它依赖于通过调用cuFFT plan函数在内部制定一个1D[2D]计划,但您可能不需要为此担心。当我把你的代码改成这样时,我已经看到了2倍的改进:
pyfftw包装FFTW库可能比
np.fft
和scipy.fftpack
包装的FFTPACK库更快。 毕竟,FFTW在西方代表最快的傅立叶变换。在最小的代码是:
以下是执行
^{pr2}$np.fft
和pyfftw
的扩展代码:最后,结果是速度显著加快:pyfftw比np.fft在我的电脑上。,使用2个线程。在
你的电脑似乎比我的好得多!在
相关问题 更多 >
编程相关推荐