Cette devrait être être facile.Mise en forme de l'alignement décimal en Python
Voici mon tableau (plutôt une méthode de génération des tableaux de test représentatifs):
>>> ri = numpy.random.randint
>>> ri2 = lambda x: ''.join(ri(0,9,x).astype('S'))
>>> a = array([float(ri2(x)+ '.' + ri2(y)) for x,y in ri(1,10,(10,2))])
>>> a
array([ 7.99914000e+01, 2.08000000e+01, 3.94000000e+02,
4.66100000e+03, 5.00000000e+00, 1.72575100e+03,
3.91500000e+02, 1.90610000e+04, 1.16247000e+04,
3.53920000e+02])
Je veux une liste de chaînes où \ n'.join (list_o_strings) imprimeraient:
79.9914
20.8
394.0
4661.0
5.0
1725.751
391.5
19061.0
11624.7
353.92
Je veux à l'espace pad à gauche et le droit (mais pas plus que nécessaire).
Je veux un zéro après la virgule si c'est tout ce qui est après la virgule.
Je ne veux pas de notation scientifique.
..et je ne veux pas perdre de chiffres significatifs. (En 353,98000000000002 2 est non significatif)
Oui, il est bon de vouloir ..
Python 2.5 de %g, %fx.x
, etc. sont soit moi befuddling, ou ne peut le faire. Je n'ai pas encore essayé import decimal
. Je ne vois pas que NumPy-t-il, soit (bien que, la array.__str__
et array.__repr__
sont alignés décimales (mais retournent parfois scientifique).
Oh, et la vitesse compte. Je fais face à de grands tableaux ici.
Mes approches actuelles de la solution sont les suivants:
- à str (a) et analyser hors des supports de numpy
- à str (e) chaque élément de la matrice et split ('') puis pad et reconstruire
- à a.astype ('S' + str (i)) où i est le maximum (len (str (a))), puis pad
Il semble qu'il devrait y en avoir dans le commerce solution là-bas ... (mais pas obligatoire)
suggestion Top échoue lorsque dtype
est float64:
>>> a
array([ 5.50056103e+02, 6.77383566e+03, 6.01001513e+05,
3.55425142e+08, 7.07254875e+05, 8.83174744e+02,
8.22320510e+01, 4.25076609e+08, 6.28662635e+07,
1.56503068e+02])
>>> ut0 = re.compile(r'(\d)0+$')
>>> thelist = [ut0.sub(r'\1', "%12f" % x) for x in a]
>>> print '\n'.join(thelist)
550.056103
6773.835663
601001.513
355425141.8471
707254.875038
883.174744
82.232051
425076608.7676
62866263.55
156.503068
Veuillez poster le code qui ne fonctionne pas. –