Me gustaría guardar el contenido de una matriz flotante numpy en un archivo binario sin formato como enteros de 16 bits con signo. Traté de lograr esto usando ndarray.tofile pero no puedo encontrar la cadena de formato correcta. Parece que el archivo se guarda en formato doble, independientemente de cómo elija la cadena de formato. ¿Cómo hago esto? Gracias.Escribir un archivo binario en bruto con datos de la matriz NumPy
Respuesta
Creo que la forma más sencilla de hacerlo es convertir primero la matriz a Int16,
array.astype('int16').tofile(filename)
Tome una mirada en el módulo de estructura, probar este ejemplo:
import struct
import numpy
f=open("myfile","wb")
mydata=numpy.random.random(10)
print(mydata)
myfmt='f'*len(mydata)
# You can use 'd' for double and <or> to force endinness
bin=struct.pack(myfmt,*mydata)
print(bin)
f.write(bin)
f.close()
Según la experiencia, le recomiendo encarecidamente ** en contra de ** el uso de 'struct.pack'. Su API requiere que exija la matriz (es decir, use el operador '*') en variables que afectan el rendimiento ** drásticamente ** para tamaños de matriz grandes. Cada elemento de la matriz necesitará un nuevo puntero de 64 bits sobre la marcha (en una máquina de 64 bits) que se creará en la pila para apuntar a ese elemento. Solo adhiérase a 'tostring' /' tobytes'/'tofile' para evitar esta sobrecarga. Por ejemplo, en nuestro caso, estábamos lidiando con matrices de 100 Mb lo que lleva a 6.4Gb de RAM por lo que 'struct.pack' puede hacer su trabajo. –
Usted puede scipy.io.savemat uso que permite guardar un diccionario de nombres y matrices en el archivo de estilo Matlab:
import scipy.io as sio
sio.savemat(filename, pydict)
Aquí
pydict puede ser = { 'tipo1': np.array1, 'tipo2': np.array2, ...}
Para cargar el dict sólo tiene:
pydict = sio.loadmat(filename)
- 1. Escribir archivo binario en Ruby
- 2. No se puede escribir un archivo binario
- 3. Escribir múltiples matrices numpy en el archivo
- 4. Escribir un búfer binario en un archivo en Python
- 5. ¿Cómo leer/escribir datos de audio en bruto en tiempo real (con python)?
- 6. Lectura de un archivo .dat binario como una matriz
- 7. Codificación :: UndefinedConversionError al escribir un archivo binario
- 8. Lee un archivo binario en una matriz
- 9. Escribir en el medio de un archivo binario existente C++
- 10. Escribir un archivo descargado binario en un disco en Java
- 11. Escribir una matriz de estructuras en un archivo binario en C
- 12. Cortar la matriz numpy con otra matriz
- 13. ¿Cómo anexar datos a un archivo binario?
- 14. Bash: escribir número entero de archivo binario
- 15. Archivo de datos de audio en bruto abierto Python
- 16. ¿Escribir una cadena de datos en una matriz de caracteres NumPy?
- 17. Escribir datos de publicaciones en un archivo con PHP
- 18. Lua: escribir valores hexadecimales como un archivo binario
- 19. matriz de objetos con numpy
- 20. Leer datos estructurados del archivo binario -?
- 21. agrupando datos en python con scipy/numpy
- 22. ¿Cómo usar la matriz NumPy con ctypes?
- 23. Escribir datos binarios en un socket (o archivo) con Python
- 24. Python escritura una matriz numpy a un archivo CSV
- 25. Escribir una matriz de triplete simple en un archivo?
- 26. lectura en un archivo binario en Haskell
- 27. Manera pitónica de poblar la matriz numpy
- 28. escribir matriz en archivo en eigen?
- 29. Guardar un marco de datos como un archivo binario
- 30. ¿Puedo anotar una matriz numpy cuando la guardo con savez
El [Documentación numpy] (http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.ndarray.tofile.html) declara que "se perdió información sobre endianness y precisión". ¿Esto está garantizado para trabajar en todas las plataformas? – Gilly
'tofile' solo escribe los datos binarios en bruto de la matriz, no los metadatos de la matriz. Un caso de uso típico es abrir un archivo, escribir un encabezado apropiado para el tipo de archivo y usar 'tofile' para completar los datos brutos. Es responsabilidad del software que lee el archivo inferir los metadatos (endianness, precision, shape) del encabezado y mutar los datos sin procesar en un formato apropiado para esa plataforma. Sin metadatos, no hay forma de interpretar correctamente el contenido sin formato de la matriz. Si todo lo que necesita es leer y escribir matrices, consulte "python hd5" o "numpy.save". –
¡Gracias! Este 'astype' adicional fue necesario incluso cuando creé la matriz especificando' np.array ([], dtype = np.int8) '. –