¿Cómo guardar y cargar los datos numpy.array () correctamente?

Me pregunto, cómo guardar y cargar los datos numpy.array correctamente. Actualmente estoy usando el método numpy.savetxt() . Por ejemplo, si tengo una matriz de markers , que se parece a esto:

introduzca la descripción de la imagen aquí

Intento guardarlo mediante el uso de:

 numpy.savetxt('markers.txt', markers) 

En otro script bash abrir el archivo previamente guardado:

 markers = np.fromfile("markers.txt") 

Y eso es lo que obtengo …

introduzca la descripción de la imagen aquí

Los datos guardados se ven así:

 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 

Pero cuando guardo los datos recién cargados por el uso del mismo método, es decir. numpy.savetxt() se ve así:

 1.398043286095131769e-76 1.398043286095288860e-76 1.396426376485745879e-76 1.398043286055061908e-76 1.398043286095288860e-76 1.182950697433698368e-76 1.398043275797188953e-76 1.398043286095288860e-76 1.210894289234927752e-99 1.398040649781712473e-76 

¿Qué estoy haciendo mal? PD: no hay ninguna otra operación “backstage” que realice. Solo guardando y cargando, y eso es lo que obtengo. Gracias de antemano.

La forma más confiable que he encontrado para hacer esto es usar np.savetxt con np.loadtxt y no np.fromfile que es más adecuado para archivos binarios escritos con tofile . Los métodos np.fromfile y np.tofile escriben y leen archivos binarios, mientras que np.savetxt escribe un archivo de texto. Así por ejemplo:

 In [1]: a = np.array([1, 2, 3, 4]) In [2]: np.savetxt('test1.txt', a, fmt='%d') In [3]: b = np.loadtxt('test1.txt', dtype=int) In [4]: a == b Out[4]: array([ True, True, True, True], dtype=bool) 

O:

 In [5]: a.tofile('test2.dat') In [6]: c = np.fromfile('test2.dat', dtype=int) In [7]: c == a Out[7]: array([ True, True, True, True], dtype=bool) 

Utilizo el método anterior incluso si es más lento y crea archivos más grandes (a veces): el formato binario puede depender de la plataforma (por ejemplo, el formato del archivo depende de la endianidad de su sistema).

Existe un formato independiente de la plataforma para matrices NumPy, que se puede guardar y leer con np.save y np.load :

 In [8]: np.save('test3.npy', a) # .npy extension is added if not given In [9]: d = np.load('test3.npy') In [10]: a == d Out[10]: array([ True, True, True, True], dtype=bool) 

np.fromfile() tiene un argumento sep= palabra clave:

Separador entre elementos si el archivo es un archivo de texto. El separador vacío (“”) significa que el archivo debe tratarse como binario. Los espacios (“”) en el separador coinciden con cero o más caracteres de espacio en blanco. Un separador que consiste solo de espacios debe coincidir con al menos un espacio en blanco.

El valor predeterminado de sep="" significa que np.fromfile() intenta leerlo como un archivo binario en lugar de un archivo de texto separado por espacios, por lo que obtiene valores sin sentido de nuevo. Si usa np.fromfile('markers.txt', sep=" ") obtendrá el resultado que está buscando.

Sin embargo, como otros han señalado, np.loadtxt() es la forma preferida de convertir archivos de texto a múltiples arreglos, y a menos que el archivo tenga que ser legible para los humanos, generalmente es mejor usar formatos binarios (por ejemplo, np.load() / np.save() ).

 np.save('data.npy', num_arr) # save new_num_arr = np.load('data.npy') # load