2011-06-27 21 views
14

Quiero usar numpy.savetxt() para guardar una matriz de números complejos en un archivo de texto. Problemas:Cómo guardar y cargar una matriz de números complejos usando numpy.savetxt?

  • Si guarda la matriz compleja con la cadena de formato predeterminada, la parte imaginaria se descarta.
  • Si usa fmt='%s', entonces numpy.loadtxt() no puede cargarlo a menos que especifique dtype=complex, converters={0: lambda s: complex(s)}. Incluso entonces, si hay NaN en la matriz, la carga sigue fallando.

Parece que alguien ha indagado sobre este multipletimes en la lista de correo Numpy e incluso presentado una bug, pero no ha obtenido una respuesta. Antes de armar algo, ¿hay alguna forma canónica de hacerlo?

Respuesta

11

Es más fácil y guarda algunas matrices temporales para simplemente reinterpretar la matriz como una matriz real.

Ahorro:

numpy.savetxt('outfile.txt', array.view(float)) 

Carga:

array = numpy.loadtxt('outfile.txt').view(complex) 

Si usted prefiere tener parte real e imaginaria en la misma línea en el archivo, puede utilizar

numpy.savetxt('outfile.txt', array.view(float).reshape(-1, 2)) 

o

array = numpy.loadtxt('outfile.txt').view(complex).reshape(-1) 

respectivamente.

(Tenga en cuenta que ni view() ni reshape() copia la matriz - se acaba de reinterpretar los mismos datos de una manera diferente.)

Adición de la cuestión autor de la pregunta:

Si desea guardar más de una matriz compleja en el mismo archivo, puede hacerlo de esta manera:

numpy.savetxt('outfile.txt', numpy.column_stack([ 
    array1.view(float).reshape(-1, 2), 
    array2.view(float).reshape(-1, 2), 
])) 

array1, array2 = numpy.loadtxt('outfile.txt', unpack=True).view(complex) 

la remodelación es necesaria porque no lo hace numpy.view() operar en arreglos con strided.

+0

¡Excelente! Corto y elegante. – ptomato

2

Aquí está mi solución, en caso de que alguien responda esta pregunta de Google.

Ahorro:

numpy.savetxt('outfile.txt', numpy.column_stack([array.real, array.imag])) 

Carga:

array_real, array_imag = numpy.loadtxt('outfile.txt', unpack=True) 
array = array_real + 1j * array_imag 

que seguirá habiendo adjudicar la marca para una mejor solución!

Cuestiones relacionadas