Este debería ser fácil.Formato de alineación decimal en Python
Aquí es mi array (más bien, un método de generación de matrices de ensayo representativos):
>>> 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])
Quiero una lista de cadenas, donde '\ n'.join (list_o_strings) imprimirían:
79.9914
20.8
394.0
4661.0
5.0
1725.751
391.5
19061.0
11624.7
353.92
Quiero espaciar la almohadilla a la izquierda y a la derecha (pero no más de lo necesario).
Quiero un cero después del decimal si eso es todo lo que está después del decimal.
No deseo notación científica.
..y no quiero perder ningún dígito significativo. (En la 353,98000000000002 2 no es significativo)
Sí, es bueno querer ..
Python 2.5 de %g, %fx.x
, etc me están confundiendo a cualquiera, o no puede hacerlo. No he intentado import decimal
todavía. No puedo ver que NumPy lo hace bien (aunque, la array.__str__
y array.__repr__
están alineados decimal (pero a veces volver científica).
Ah, y la velocidad cuenta. Estoy tratando con grandes matrices aquí.
Mis principios de solución son: ('')
- a STR (a) y el análisis sintáctico de los soportes de NumPy
- a STR (e) cada elemento de la matriz y se dividió a continuación, almohadilla y reconstruir
- a a.astype ('S' + str (i)) donde i es el máximo (len (str (a))), y luego pad
Parece que debe haber un poco de la plataforma solución por ahí ... (aunque no necesario)
Top sugerencia cuando falla con float64 dtype
es:
>>> 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
Por favor, publique el código que no funciona. –