Guardar una matriz numpy con datos mixtos

Tengo una matriz numpy donde cada valor es un flotante seguido de un entero, por ejemplo:

my_array = numpy.array([0.4324321, 0, 0.9437212, 1, 0.4738721, 0, 0.49327321, 0]) 

Me gustaría guardarlo así:

 0.4324321 0 0.9437212 1 0.4738721 0 0.49327321 0 

Pero si llamo:

 numpy.savetxt('output.dat',my_array,fmt='%f %i') 

Me sale un error:

 AttributeError: fmt has wrong number of % formats. %f %i 

¿Cómo puedo arreglar esto?

El problema real es que al imprimir una matriz 1D de 8 elementos se obtienen 8 filas de 1 columna (o, si fuerza, 1 fila de 8 columnas), no 4 filas de 2 columnas. Por lo tanto, solo puede especificar un formato único (o, si fuerza cosas, 1 u 8 formatos).

Si desea mostrar esto en una forma 4×2 en lugar de 1×8, primero debe cambiar la forma de la matriz:

 numpy.savetxt('output.dat', my_array.reshape((4,2)), fmt='%f %i') 

Esto te dará:

 0.432432 0 0.943721 1 0.473872 0 0.493273 0 

Los documentos son un poco confusos, ya que dedican la mayor parte de la redacción a tratar con números complejos en lugar de simples flotantes e ints, pero las reglas básicas son las mismas. Usted especifica un especificador único o un especificador para cada columna (el caso intermedio de especificar partes reales e imaginarias para cada columna no es relevante).


Si desea escribirlo en 1 fila de 8 columnas, primero debe cambiarlo en algo con 1 fila de 8 columnas en lugar de 8 filas.

Y luego necesitas especificar 8 formatos. No hay forma de decir “repetir estos dos formatos cuatro veces”, pero es bastante fácil hacerlo sin la ayuda de numpy:

 numpy.savetxt('output.dat', my_array.reshape((1,8)), fmt='%f %i ' * 4) 

Y eso te da:

 0.432432 0 0.943721 1 0.473872 0 0.493273 0 

El problema es que savetxt() imprimirá una fila para cada entrada de matriz. Puede forzar una 2D-array creando un nuevo eje y luego imprimir el formato (1x8) :

 numpy.savetxt('output.dat', my_array[numpy.newaxis,:], fmt='%f %i'*4)