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.fftfreqnumpy.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 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

scipy.fftpack fft

scipy.fftpack的FFT冻结

scipy详解

scipy-图片处理

机器学习基础 | Scipy 简易入门

Python------SciPy模块