numpy.fft和scipy.fftpack有什么区别?
后者只是前者的同义词,还是它们是两种不同的快速傅里叶变换(FFT)实现?哪一个更好呢?
3 个回答
4
看看这两个库在GitHub上的代码,scipy并不是简单地把numpy的版本拿过来改个名字(虽然它确实借用了部分功能)。如果你想了解它们在实现上的区别,就得深入研究代码,因为文档里没有直接的比较。
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的功能更强大:
- 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,其实你是在运行同样的代码。
不过,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