numpy.fft和scipy.fftpack有什么区别?

76

后者只是前者的同义词,还是它们是FFT的两种不同实现方式?哪个更好呢?


有趣的问题。文档没有提供太多信息。我在解释导入策略的上下文中找到了这句话:“让我们考虑这样一种情况,即您(出于任何原因)想要比较numpy和scipy的fft函数。”(请参见此网站的末尾)。好吧,“……出于任何原因……” - Oben Sonne
@ObenSonne 那个页面已经更新了,但是你提到的内容仍然可以在这里找到。 - karlphillip
3个回答

46

SciPy提供了更多功能:

此外,SciPy通过自己的接口导出了一些NumPy的特性。例如,如果你执行scipy.fftpack.helper.fftfreqnumpy.fft.helper.fftfreq,实际上运行的是相同的代码。

然而,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


3
他们为什么选择保持两种不同的实现,你有任何想法吗? - dtlussier
3
Scipy 的傅里叶变换函数会检查你的数据类型是否为实数,如果是,它会使用效率提高两倍的 rfft。而 NumPy 的傅里叶变换函数则不会这样做。 - endolith
4
scipy返回的数据格式非常不方便-在第一个元素之后交替显示实数和虚数部分。一旦将其拆分并转换为复数,进行计算,然后再全部转换回去,就会失去很多(但不是全部)速度优势。基本上这不是一个公平的比较-numpy的时间包括使输出可用,而不仅仅是执行fft。 - Corvus
2
另外,请查看http://hgomersall.github.io/pyFFTW/pyfftw/interfaces/interfaces.html。它是一个很好的包装器,可作为numpy.fft或scipy.fftpack的替代品。 - nick maxwell
你可以使用dtype技巧将“alternating”数组视为复数数组(我相信除了第一个元素)。@Corone - ZisIsNotZis
显示剩余2条评论

20

我发现numpy的二维fft明显比scipy的快,但使用PyFFTW绑定的FFTW速度更快。性能测试在这里:

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

1
顺便提一下,我认为速度很大程度上取决于您为numpy/scipy编译了哪些支持包,例如如果您编译了BLAS/LAPACK以及使用的编译器和编译器标志。但是我不知道哪些编译器/标志更快 =( - keflavich

4

1
Numpy使用FFTPACK Fortran程序的C移植版本,而Scipy使用原始的Fortran版本。 - divenex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接