Me pregunto cómo guardar y cargar numpy.array
datos correctamente. Actualmente estoy usando el numpy.savetxt()
método. Por ejemplo, si tengo una matriz markers
, que se ve así:
Intento salvarlo mediante el uso de:
numpy.savetxt('markers.txt', markers)
En otro script, intento abrir un archivo guardado previamente:
markers = np.fromfile("markers.txt")
Y eso es lo que obtengo ...
Los datos guardados primero 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 mediante el uso del mismo método, es decir. numpy.savetxt()
se parece a esto:
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 otra operación "entre bastidores" que realice. Solo guardando y cargando, y eso es lo que obtengo. Gracias de antemano.
np.save()
ynp.load()
.scipy.io.savemat
yscipy.io.loadmat
.fromfile
es leer los datos como binarios.loadtxt
es el emparejamiento correcto consavetxt
. Mira la documentación de la función.Respuestas:
La forma más confiable que he encontrado para hacer esto es usar
np.savetxt
connp.loadtxt
y nonp.fromfile
cuál es más adecuado para archivos binarios escritos contofile
. Los métodosnp.fromfile
ynp.tofile
escriben y leen archivos binarios mientras quenp.savetxt
escriben un archivo de texto. Así por ejemplo:O:
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 de archivo depende del endianness de su sistema).
Existe un formato independiente de la plataforma para matrices NumPy, que se puede guardar y leer con
np.save
ynp.load
:fuente
.npy
Los archivos (por ejemplo, generados pornp.save()
) son independientes de la plataforma y serán más compactos y rápidos de crear que los archivos de texto.np.savez
si desea comprimir la salida.np.savez
guarda varias matrices sin comprimir; lasnp.savez_compressed
comprimirá; todavía no hay ningunanp.save_compressed
. Ver docs.scipy.org/doc/numpy-1.15.1/reference/routines.io.htmlfuente
pickle
?x = db["x"]
siguey = db["y"]
?np.fromfile()
tiene unsep=
argumento de palabra clave:El valor predeterminado de
sep=""
significa quenp.fromfile()
intenta leerlo como un archivo binario en lugar de un archivo de texto separado por espacios, por lo que obtiene valores sin sentido. Si lonp.fromfile('markers.txt', sep=" ")
usas obtendrás el resultado que buscas.Sin embargo, como han señalado otros,
np.loadtxt()
es la forma preferida de convertir archivos de texto en matrices numpy y, a menos que el archivo deba ser legible por humanos, generalmente es mejor usar formatos binarios en su lugar (por ejemplo,np.load()
/np.save()
).fuente
pickle
?Para una respuesta corta, debe usar
np.save
ynp.load
. La ventaja de estos es que están hechos por desarrolladores de la biblioteca numpy y ya funcionan (además, es probable que ya estén optimizados muy bien), por ejemplo.Respuesta ampliada:
Al final, realmente depende de sus necesidades porque también puede guardarlo en formato legible por humanos (consulte este Volcado de una matriz NumPy en un archivo csv ) o incluso con otras bibliotecas si sus archivos son extremadamente grandes (consulte esta mejor manera de preservar matrices numpy en disco para una discusión ampliada).
Sin embargo, (haciendo una expansión ya que usa la palabra "correctamente" en su pregunta) todavía creo que usar la función numpy lista para usar (¡y la mayoría del código!) Probablemente satisfaga la mayoría de las necesidades de los usuarios. La razón más importante es que ya funciona . Tratar de usar otra cosa por cualquier otra razón puede llevarlo a una madriguera inesperadamente LARGA para descubrir por qué no funciona y forzarlo a que funcione.
Tomemos, por ejemplo, intentar salvarlo con pepinillo. Lo intenté solo por diversión y me tomó al menos 30 minutos darme cuenta de que pickle no guardaría mis cosas a menos que abriera y leyera el archivo en modo bytes con
wb
. Tomó tiempo para google, probar cosas, entender el mensaje de error, etc. Un pequeño detalle, pero el hecho de que ya me obligara a abrir un archivo complicó las cosas de maneras inesperadas. Para agregar que me obligó a volver a leer esto (que por cierto es algo confuso) ¿ Diferencia entre los modos a, a +, w, w + y r + en la función abierta incorporada? .Entonces, si hay una interfaz que satisface sus necesidades, úsela a menos que tenga una ( muy ) buena razón (por ejemplo, compatibilidad con matlab o por alguna razón, realmente desea leer el archivo e imprimir en python realmente no satisface sus necesidades, lo cual podría ser cuestionable). Además, lo más probable es que, si necesita optimizarlo, lo descubra más adelante (en lugar de pasar años depurando cosas inútiles como abrir un simple archivo numpy).
Así que usa la interfaz / numpy provide . Puede que no sea perfecto, lo más probable es que esté bien, especialmente para una biblioteca que ha existido durante tanto tiempo.
Ya gasté el almacenamiento y la carga de datos con numpy de muchas maneras, así que diviértete, ¡espero que te ayude!
Algunos comentarios sobre lo que aprendí:
np.save
como se esperaba, esto ya lo comprime bien (consulte https://stackoverflow.com/a/55750128/1601580 ), funciona de inmediato sin abrir ningún archivo. Limpiar. Fácil. Eficiente. Úselo.np.savez
usa un formato sin comprimir (ver documentos )Save several arrays into a single file in uncompressed
.npzformat.
Si decide usar esto (se le advirtió que se alejara de la solución estándar, ¡así que espere errores!), puede descubrir que necesita usar nombres de argumentos para guardarlo, a menos que desee utilice los nombres predeterminados. Así que no use esto si el primero ya funciona (¡o cualquier trabajo lo usa!)hdf5
para archivos grandes. ¡Frio! https://stackoverflow.com/a/9619713/1601580Tenga en cuenta que esta no es una respuesta exhaustiva. Pero para otros recursos, verifique esto:
np.save
): Guarde Numpy Array usando Picklefuente