numpy.fft 和 scipy.fftpack 有啥区别?
Posted
技术标签:
【中文标题】numpy.fft 和 scipy.fftpack 有啥区别?【英文标题】:What is the difference between numpy.fft and scipy.fftpack?numpy.fft 和 scipy.fftpack 有什么区别? 【发布时间】:2011-09-15 19:54:53 【问题描述】:后者只是前者的同义词,还是它们是 FFT 的两种不同实现?哪个更好?
【问题讨论】:
有趣的问题。文档没有说太多。我刚刚在解释导入策略的上下文中找到了这句话:“让我们考虑一下您(无论出于何种原因)想要比较 numpy 和 scipy 的 fft 函数的情况。” (see end of this site)。嗯,“……不管什么原因……” @ObenSonne 该页面已更新,但您提到的内容仍然可以找到here。 【参考方案1】:SciPy 做得更多:
http://docs.scipy.org/doc/numpy/reference/routines.fft.html http://docs.scipy.org/doc/scipy/reference/fftpack.html#此外,SciPy 通过自己的接口导出一些 NumPy 功能,例如如果您执行 scipy.fftpack.helper.fftfreq 和 numpy.fft.helper.fftfreq em> 你实际上在运行相同的代码。
但是,SciPy 有自己的许多功能实现。该源具有比较原始 NumPy 和新 SciPy 版本的性能基准。我的老式笔记本电脑显示如下:
Fast Fourier Transform
=================================================
| real input | complex input
-------------------------------------------------
size | scipy | numpy | scipy | numpy
-------------------------------------------------
100 | 0.07 | 0.06 | 0.06 | 0.07 (secs for 7000 calls)
1000 | 0.06 | 0.09 | 0.09 | 0.09 (secs for 2000 calls)
256 | 0.11 | 0.11 | 0.12 | 0.11 (secs for 10000 calls)
512 | 0.16 | 0.21 | 0.20 | 0.21 (secs for 10000 calls)
1024 | 0.03 | 0.04 | 0.04 | 0.04 (secs for 1000 calls)
2048 | 0.05 | 0.09 | 0.08 | 0.08 (secs for 1000 calls)
4096 | 0.05 | 0.08 | 0.07 | 0.09 (secs for 500 calls)
8192 | 0.10 | 0.20 | 0.19 | 0.21 (secs for 500 calls)
随着数组大小的增加,SciPy 的运行速度似乎确实快得多,尽管这些只是人为的示例,对于您的特定项目来说,两者都值得试验。
值得查看源代码 http://www.scipy.org/Download#head-312ad78cdf85a9ca6fa17a266752069d23f785d1 。是的,那些 .f 文件真的是 Fortran! :-D
【讨论】:
知道他们为什么选择维护两个不同的实现吗? scipy 的 fft 检查您的数据类型是否真实,如果是,则使用效率两倍的 rfft。 numpy 的 fft 没有。 scipy 以一种非常无用的格式返回数据——在第一个元素之后交替实部和虚部。一旦你把它分开,转换成复数,完成你的计算,然后把它全部转换回来,你会失去很多(但不是全部)加速。基本上这不是一个公平的比较 - numpy 的时间包括使输出可用,而不仅仅是做 fft。 另外,请查看hgomersall.github.io/pyFFTW/pyfftw/interfaces/interfaces.html 这是一个很好的 fftw 包装器,可以作为 numpy.fft 或 scipy.fftpack 的替代品。 您可以使用 dtype 技巧将view
“交替”数组作为复数数组(我相信的第一个元素除外)@Corone【参考方案2】:
查看每个的 github 存储库,scipy 不仅仅是导入 numpy 的版本并重命名它(尽管它确实借用了一些功能)。如果您想辨别实现中的差异,则必须深入研究代码,因为文档没有进行直接比较。
https://github.com/numpy/numpy/tree/master/numpy/fft
https://github.com/scipy/scipy/tree/master/scipy/fftpack
【讨论】:
Numpy 使用 FFTPACK Fortran 程序的 C 移植,而 Scipy 使用原始 Fortran 版本。【参考方案3】:我发现 numpy 的 2D fft 明显快于 scipy,但 FFTW 比两者都快(使用 PyFFTW 绑定)。性能测试在这里: code.google.com/p/agpy/source/browse/trunk/tests/test_ffts.py
以及结果(对于n
x n
数组):
n sp np fftw
8: 0.010189 0.005077 0.028378
16: 0.010795 0.008069 0.028716
32: 0.014351 0.008566 0.031076
64: 0.028796 0.019308 0.036931
128: 0.093085 0.074986 0.088365
256: 0.459137 0.317680 0.170934
512: 2.652487 1.811646 0.571402
1024: 10.722885 7.796856 3.509452
【讨论】:
作为旁注,我认为速度很大程度上取决于您为 numpy/scipy 编译的支持包,例如如果您已经编译了 BLAS/LAPACK 并使用了哪些编译器和编译器标志。但我不知道哪些编译器/标志更快 =(以上是关于numpy.fft 和 scipy.fftpack 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章