2012-10-05 17 views
6

Parece algo trivial para mí, pero todavía me falta una manera eficiente y "limpia" de insertar una serie de elementos pertenecientes a numpy array (como aa[:,:]) en una cadena formateada para ser impreso/escrito. De hecho las sintaxis de especificación extendidos elemento por elemento gustan:cadena de serie formateada de numpy array elements

formattedline= '%10.6f %10.6f %10.6f' % (aa[ii,0], aa[ii,1], aa[ii,2]) 
file1.write(formattedline+'\n') 

están trabajando.

Pero no he encontrado ninguna otra solución más corto, debido a que:

formattedline= '%10.6f %10.6f %10.6f' % (float(aa[ii,:])) 
file1.write(formattedline+'\n') 

da por supuesto: TypeError: only length-1 arrays can be converted to Python scalars

o:

formattedline= '%10.6f %10.6f %10.6f' % (aa[ii,:]) 
file1.write(formattedline+'\n') 

da: TypeError: float argument required, not numpy.ndarray. He tratado con iteradores, pero sin éxito.

Por supuesto, esto es interesante cuando hay varios elementos que se van a imprimir.

Así que: ¿Cómo puedo combinar iteración sobre matriz numpy y secuencia de la manera formato?

Respuesta

5

Se podría convertirla en una tupla:

formattedline = '%10.6f %10.6f %10.6f' % (tuple(aa[ii,:])) 

En un caso más general se puede utilizar un join:, np

formattedline = ' '.join('%10.6f'%F for F in aa[ii,:]) 
+0

¡eso es bueno y funciona! :) ... así que la segunda solución es en realidad iterar sobre la matriz numpy, muy agradable. – gluuke

+0

... pero aún así, agregando una cadena: 'formattedline = '% 4s% 10.6f% 10.6f% 10.6f'% (string1, (tuple (aa [ii,:])))' da 'TypeError: argumento float requerido, no tuple' y yo no entiendo por qué – gluuke

+0

@gluuke es necesario agregar ellas: '(cadena1,) + tupla (aa [ii,:])'. –

2

Si está escribiendo toda la matriz a un archivo de uso .savetxt:

np.savetxt(file1, aa, fmt = '%10.6f') 

El parámetro fmt puede ser un solo formato, o una sequenc e de formatos, o una cadena multiformato como

'%10.6f %5.6f %d' 
+0

... gracias! Pero ¿qué pasa si no estoy guardando toda la matriz al mismo tiempo? ... ¿Entonces si estoy agregando porciones de matriz combinadas con algún texto? – gluuke

+0

Entonces creo que la sugerencia de @ hayden es la mejor. Bajo el capó, '' np.savetxt' llama fh.write (asbytes (formato% de tupla (fila) + salto de línea)) '. (En Python2, 'asbytes = str'.) – unutbu