2012-11-05 5 views
2

Je n'ai besoin que de la partie fractionnaire d'un tableau. en utilisant la fonction numf ou simplement python modf est pratique.partie fractionnaire du tableau numpy

Dans le cas où nous les grands tableaux de données positives fractions, qui peut être aussi grand que (1000000,3) par exemple, ce qui est plus pratique de le faire:

numpy.modf(array)[0] 
array-numpy.trunc(array) 

À mon avis 2 est plus rapide et moins cher en utilisation de la mémoire ... mais pas sûr. Que pensent les experts python et numpy?

Répondre

3

Je ne suis pas un expert, donc je dois utiliser le module timeit pour vérifier la vitesse. J'utilise IPython (ce qui facilite le timing) mais même sans le module timeit est probablement le chemin à parcourir.

In [21]: a = numpy.random.random((10**6, 3)) 

In [22]: timeit numpy.modf(a)[0] 
10 loops, best of 3: 90.1 ms per loop 

In [23]: timeit a-numpy.trunc(a) 
10 loops, best of 3: 135 ms per loop 

In [24]: timeit numpy.mod(a, 1.0) 
10 loops, best of 3: 68.3 ms per loop 

In [25]: timeit a % 1.0 
10 loops, best of 3: 68.1 ms per loop 

Les deux derniers sont équivalents. Je ne sais pas grand-chose sur l'utilisation de la mémoire, mais je serais surpris si modf(a)[0] et a-numpy.trunc(a) n'utilisaient pas plus de mémoire que de simplement prendre le mod directement.

[BTW, si votre code fait ce que vous voulez et que vous êtes seulement intéressé par les améliorations, vous pourriez être intéressé par the codereview stackexchange. Je ne sais toujours pas où se situe la ligne de démarcation, mais cela ressemble un peu plus à leur tasse de thé.]

+0

Je n'ai pas pensé à% 1, je pense que c'est la solution la plus pratique parce qu'il utilise purement python salutations – Cobry

+0

Je devrais espérer que les "experts" utilisent 'timeit' pour vérifier la vitesse aussi. Lorsque le caoutchouc rencontre la route, il est (généralement) impossible de dire comment quelque chose fonctionnera jusqu'à ce que vous le mesuriez réellement. – mgilson

+0

Vous pouvez obtenir la meilleure performance si vous utilisez% = 1. au lieu d'utiliser un nouveau tableau pour stocker les valeurs, car il modifie le tableau en place – EnricoGiampieri