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

76 投票
3 回答
52352 浏览
提问于 2025-04-16 19:38

后者只是前者的同义词,还是它们是两种不同的快速傅里叶变换(FFT)实现?哪一个更好呢?

3 个回答

4

看看这两个库在GitHub上的代码,scipy并不是简单地把numpy的版本拿过来改个名字(虽然它确实借用了部分功能)。如果你想了解它们在实现上的区别,就得深入研究代码,因为文档里没有直接的比较。

https://github.com/numpy/numpy/tree/master/numpy/fft

https://github.com/scipy/scipy/tree/master/scipy/fftpack

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
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

撰写回答