web-dev-qa-db-fra.com

Convertir la liste de numpy.float64 pour flotter rapidement en Python

Quel est le moyen le plus rapide de convertir une liste d’éléments de type numpy.float64 en types float? J'utilise actuellement la simple itération for loop en conjonction avec float().

Je suis tombé sur ce post: Conversion de numpy dtypes en types python natifs , mais ma question ne concerne pas la conversion de types en python, mais plutôt la conversion plus précise d’une liste entière d’un type en un autre dans le même fichier. manière la plus rapide possible en python (c'est-à-dire dans ce cas précis numpy.float64 to float). J'espérais des machines secrètes en python que je n'avais pas rencontrées et qui pourraient tout faire d'un coup :)

5
Darth Hexamal

La méthode tolist() devrait faire ce que vous voulez. Si vous avez un tableau numpy, appelez simplement tolist():

In [17]: a
Out[17]: 
array([ 0.        ,  0.14285714,  0.28571429,  0.42857143,  0.57142857,
        0.71428571,  0.85714286,  1.        ,  1.14285714,  1.28571429,
        1.42857143,  1.57142857,  1.71428571,  1.85714286,  2.        ])

In [18]: a.dtype
Out[18]: dtype('float64')

In [19]: b = a.tolist()

In [20]: b
Out[20]: 
[0.0,
 0.14285714285714285,
 0.2857142857142857,
 0.42857142857142855,
 0.5714285714285714,
 0.7142857142857142,
 0.8571428571428571,
 1.0,
 1.1428571428571428,
 1.2857142857142856,
 1.4285714285714284,
 1.5714285714285714,
 1.7142857142857142,
 1.857142857142857,
 2.0]

In [21]: type(b)
Out[21]: list

In [22]: type(b[0])
Out[22]: float

Si, en fait, vous avez vraiment une liste d'objets python numpy.float64, alors la réponse de @ Alexander est excellente, ou vous pouvez convertir la liste en tableau puis utiliser la méthode tolist(). Par exemple.

In [46]: c
Out[46]: 
[0.0,
 0.33333333333333331,
 0.66666666666666663,
 1.0,
 1.3333333333333333,
 1.6666666666666665,
 2.0]

In [47]: type(c)
Out[47]: list

In [48]: type(c[0])
Out[48]: numpy.float64

@ La suggestion d'Alexandre, une compréhension de la liste:

In [49]: [float(v) for v in c]
Out[49]: 
[0.0,
 0.3333333333333333,
 0.6666666666666666,
 1.0,
 1.3333333333333333,
 1.6666666666666665,
 2.0]

Ou bien, convertissez-les en tableau et utilisez ensuite la méthode tolist().

In [50]: np.array(c).tolist()
Out[50]: 
[0.0,
 0.3333333333333333,
 0.6666666666666666,
 1.0,
 1.3333333333333333,
 1.6666666666666665,
 2.0]

Si vous êtes préoccupé par la vitesse, voici une comparaison. L'entrée, x, est une liste python d'objets numpy.float64:

In [8]: type(x)
Out[8]: list

In [9]: len(x)
Out[9]: 1000

In [10]: type(x[0])
Out[10]: numpy.float64

Calendrier pour la compréhension de la liste:

In [11]: %timeit list1 = [float(v) for v in x]
10000 loops, best of 3: 109 µs per loop

Délai de conversion en tableau numpy puis tolist():

In [12]: %timeit list2 = np.array(x).tolist()
10000 loops, best of 3: 70.5 µs per loop

Il est donc plus rapide de convertir la liste en un tableau, puis d’appeler tolist().

10
Warren Weckesser

Vous pourriez utiliser une compréhension de liste:

floats = [float(np_float) for np_float in np_float_list]
5
Alexander

Donc, parmi les solutions possibles que j'ai trouvées (merci beaucoup à Warren Weckesser et Alexander pour avoir signalé toutes les meilleures approches possibles), j'ai exécuté ma méthode actuelle et celle présentée par Alexander pour donner une comparaison simple pour les exécutions (les deux choix découlent du fait que je dispose d’une liste exacte d’éléments de numpy.float64 et que je souhaite les convertir rapidement en float):

2 approches couvertes: compréhension de la liste et base pour l'itération de boucle

D'abord voici le code:

import datetime
import numpy

list1 = []
for i in range(0,1000):
    list1.append(numpy.float64(i))
list2 = []
t_init = time.time()
for num in list1:
    list2.append(float(num))
t_1 = time.time()
list2 = [float(np_float) for np_float in list1]
t_2 = time.time()

print("t1 run time: {}".format(t_1-t_init))
print("t2 run time: {}".format(t_2-t_1))

J'ai couru quatre fois pour donner un ensemble rapide de résultats:

>>> run 1
t1 run time: 0.000179290771484375
t2 run time: 0.0001533031463623047
Python 3.4.0

>>> run 2
t1 run time: 0.00018739700317382812
t2 run time: 0.0001518726348876953
Python 3.4.0

>>> run 3
t1 run time: 0.00017976760864257812
t2 run time: 0.0001513957977294922
Python 3.4.0

>>> run 4
t1 run time: 0.0002455711364746094
t2 run time: 0.00015997886657714844
Python 3.4.0

Clairement, pour convertir une liste vraie de numpy.float64 en float, l'approche optimale consiste à utiliser la compréhension de liste de python.

1
Darth Hexamal