web-dev-qa-db-fra.com

Quelle est la différence entre numpy.fft et scipy.fftpack?

Est-ce que ce dernier n'est qu'un synonyme du premier, ou s'agit-il de deux implémentations différentes de la FFT? Quel est le meilleur?

50
Charles Brunet

SciPy fait plus:

De plus, SciPy exporte certaines des fonctionnalités NumPy via sa propre interface, par exemple si vous exécutez scipy.fftpack.helper.fftfreq et numpy.fft.helper.fftfreq vous utilisez en fait le même code.

Cependant, SciPy a ses propres implémentations de nombreuses fonctionnalités. La source a des repères de performance qui comparent les versions originales de NumPy et de SciPy. Mon ordinateur portable archaïque montre quelque chose comme ceci:

                 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)

Il semble que SciPy s'exécute beaucoup plus rapidement à mesure que la taille de la baie augmente, bien que ce ne soient que des exemples artificiels et qu'il serait utile d'expérimenter les deux pour votre projet particulier.

Cela vaut la peine de vérifier le code source http://www.scipy.org/Download#head-312ad78cdf85a9ca6fa17a266752069d23f785d1 . Oui, ces fichiers .f sont vraiment Fortran! :-RÉ

34
jond3k

J'ai trouvé que le fft 2D de numpy était significativement plus rapide que scipy's, mais FFTW était plus rapide que les deux (en utilisant les liaisons PyFFTW). Les tests de performances sont ici: code.google.com/p/agpy/source/browse/trunk/tests/test_ffts.py

Et les résultats (pour les tableaux 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
16
keflavich

En regardant les dépôts github pour chacun, scipy ne se contente pas d'importer la version de numpy et de la renommer (bien qu'elle emprunte certaines fonctionnalités). Vous devrez creuser dans le code si vous voulez discerner la différence dans les implémentations car la documentation ne fait pas de comparaison directe.

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

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

3
JoshAdel