451 votes

Comment imprimer un tableau numpy.array sans notation scientifique et avec une précision donnée ?

Je suis curieux de savoir s'il existe un moyen d'imprimer des documents formatés. numpy.arrays par exemple, d'une manière similaire à celle-ci :

x = 1.23456
print '%.3f' % x

Si je veux imprimer le numpy.array de flottants, il imprime plusieurs décimales, souvent au format "scientifique", qui est plutôt difficile à lire, même pour les tableaux de faible dimension. Cependant, numpy.array doit apparemment être imprimé comme une chaîne de caractères, c'est-à-dire, avec %s . Existe-t-il une solution à ce problème ?

1 votes

cette discussion pourrait aussi intéresser ceux qui arrivent ici via une recherche google.

2voto

Mike Lampton Points 151

Je trouve que le format habituel des flottants {:9.5f} fonctionne correctement -- en supprimant les e-notations de petites valeurs -- quand on affiche une liste ou un tableau en utilisant une boucle. Mais ce format ne parvient pas toujours à supprimer son e-notation lorsqu'un formateur a plusieurs éléments dans une seule instruction d'impression. Par exemple :

import numpy as np
np.set_printoptions(suppress=True)
a3 = 4E-3
a4 = 4E-4
a5 = 4E-5
a6 = 4E-6
a7 = 4E-7
a8 = 4E-8
#--first, display separate numbers-----------
print('Case 3:  a3, a4, a5:             {:9.5f}{:9.5f}{:9.5f}'.format(a3,a4,a5))
print('Case 4:  a3, a4, a5, a6:         {:9.5f}{:9.5f}{:9.5f}{:9.5}'.format(a3,a4,a5,a6))
print('Case 5:  a3, a4, a5, a6, a7:     {:9.5f}{:9.5f}{:9.5f}{:9.5}{:9.5f}'.format(a3,a4,a5,a6,a7))
print('Case 6:  a3, a4, a5, a6, a7, a8: {:9.5f}{:9.5f}{:9.5f}{:9.5f}{:9.5}{:9.5f}'.format(a3,a4,a5,a6,a7,a8))
#---second, display a list using a loop----------
myList = [a3,a4,a5,a6,a7,a8]
print('List 6:  a3, a4, a5, a6, a7, a8: ', end='')
for x in myList: 
    print('{:9.5f}'.format(x), end='')
print()
#---third, display a numpy array using a loop------------
myArray = np.array(myList)
print('Array 6: a3, a4, a5, a6, a7, a8: ', end='')
for x in myArray:
    print('{:9.5f}'.format(x), end='')
print()

Mes résultats montrent le bug dans les cas 4, 5 et 6 :

Case 3:  a3, a4, a5:               0.00400  0.00040  0.00004
Case 4:  a3, a4, a5, a6:           0.00400  0.00040  0.00004    4e-06
Case 5:  a3, a4, a5, a6, a7:       0.00400  0.00040  0.00004    4e-06  0.00000
Case 6:  a3, a4, a5, a6, a7, a8:   0.00400  0.00040  0.00004  0.00000    4e-07  0.00000
List 6:  a3, a4, a5, a6, a7, a8:   0.00400  0.00040  0.00004  0.00000  0.00000  0.00000
Array 6: a3, a4, a5, a6, a7, a8:   0.00400  0.00040  0.00004  0.00000  0.00000  0.00000

Je n'ai pas d'explication pour cela, et c'est pourquoi j'utilise toujours une boucle pour la sortie flottante de valeurs multiples.

2voto

albapa Points 251

J'utilise

def np_print(array,fmt="10.5f"):
    print (array.size*("{:"+fmt+"}")).format(*array)

Il n'est pas difficile de le modifier pour les tableaux multidimensionnels.

1voto

jtniehof Points 194

numpy.char.mod peut également être utile, en fonction des détails de votre application, par exemple : numpy.char.mod('Value=%4.2f', numpy.arange(5, 10, 0.1)) retournera un tableau de chaînes de caractères avec les éléments "Value=5.00", "Value=5.10", etc. (à titre d'exemple un peu artificiel).

0voto

jpp Points 83462

Une autre option encore consiste à utiliser le decimal module :

import numpy as np
from decimal import *

arr = np.array([  56.83,  385.3 ,    6.65,  126.63,   85.76,  192.72,  112.81, 10.55])
arr2 = [str(Decimal(i).quantize(Decimal('.01'))) for i in arr]

# ['56.83', '385.30', '6.65', '126.63', '85.76', '192.72', '112.81', '10.55']

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X