web-dev-qa-db-fra.com

Mise en forme des flottants dans un tableau numpy

Si j'ai un tableau numpy comme ceci:

[2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01]

comment puis-je déplacer la virgule décimale et formater les nombres afin de me retrouver avec un tableau numpy comme ceci:

[21.53, 8.13, 3.97, 10.08]

np.around(a, decimals=2) ne me donne que [2.15300000e+01, 8.13000000e+00, 3.97000000e+00, 1.00800000e+01] Ce que je ne veux pas et je n'ai pas trouvé d'autre moyen de le faire.

47
Kaly

Pour que numpy affiche des tableaux flottants dans un format arbitraire, vous pouvez définir une fonction personnalisée prenant une valeur float en entrée et renvoyant une chaîne mise en forme. :

In [1]: float_formatter = lambda x: "%.2f" % x

f signifie ici un format à virgule fixe (et non "scientifique"), et le .2 signifie deux décimales (pour en savoir plus sur le formatage des chaînes ici ).

Testons-le avec une valeur float:

In [2]: float_formatter(1.234567E3)
Out[2]: '1234.57'

Pour rendre numpy imprimer tous les tableaux float de cette façon, vous pouvez passer le formatter= argument pour np.set_printoptions:

In [3]: np.set_printoptions(formatter={'float_kind':float_formatter})

Numpy va maintenant imprimer tous les tableaux de float de cette façon:

In [4]: np.random.randn(5) * 10
Out[4]: array([5.25, 3.91, 0.04, -1.53, 6.68]

Notez que cela n'affecte que les tableaux numpy, pas les scalaires:

In [5]: np.pi
Out[5]: 3.141592653589793

Cela n'affectera pas non plus les non-floats, les floats complexes, etc. - vous devrez définir des formateurs séparés pour les autres types de scalaires.

Vous devez également savoir que cela uniquement affecte la façon dont numpy affiche les valeurs flottantes - les valeurs réelles qui seront utilisées dans les calculs conserveront leur précision d'origine.

Par exemple:

In [6]: a = np.array([1E-9])

In [7]: a
Out[7]: array([0.00])

In [8]: a == 0
Out[8]: array([False], dtype=bool)

numpy affiche a comme s'il était égal à 0, mais ce n’est pas - il est toujours égal à 1E-9.

Si vous voulez réellement arrondir les valeurs de votre tableau d'une manière qui affecte leur utilisation dans les calculs, vous devez utiliser np.round, comme d’autres l’ont déjà fait remarquer.

65
ali_m

Vous confondez la précision réelle et la précision d'affichage. L'arrondi décimal ne peut pas être représenté exactement en binaire. Tu devrais essayer:

> np.set_printoptions(precision=2)
> np.array([5.333333])
array([ 5.33])
29
U2EF1

Vous pouvez utiliser la fonction round. Voici quelques exemples

numpy.round([2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01],2)
array([ 21.53,   8.13,   3.97,  10.08])

SI vous voulez changer, affichez simplement la représentation, je voudrais pas il est recommandé de modifier le format d'impression globalement, comme suggéré ci-dessus. Je voudrais formater ma sortie en place.

>>a=np.array([2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01])
>>> print([ "{:0.2f}".format(x) for x in a ])
['21.53', '8.13', '3.97', '10.08']
25
rth
[ round(x,2) for x in [2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01]]
1
Roland