python - tutorial - convertir una cadena binaria a una matriz numpy
recorrer una matriz en python (1)
>>> np.fromstring(b''/x00/x00/x80?/x00/x00/x00@/x00/x00@@/x00/x00/x80@'', dtype=''<f4'') # or dtype=np.dtype(''<f4''), or np.float32 on a little-endian system (which most computers are these days)
array([ 1., 2., 3., 4.], dtype=float32)
O, si quieres big endian:
>>> np.fromstring(b''/x00/x00/x80?/x00/x00/x00@/x00/x00@@/x00/x00/x80@'', dtype=''>f4'') # or dtype=np.dtype(''>f4''), or np.float32 on a big-endian system
array([ 4.60060299e-41, 8.96831017e-44, 2.30485571e-41,
4.60074312e-41], dtype=float32)
La b
no es necesaria antes de Python 3, por supuesto.
De hecho, si realmente está utilizando un archivo binario para cargar los datos, incluso podría omitir el paso de usar una cadena y cargar los datos directamente desde el archivo con numpy.fromfile()
.
Además, dtype reference, por si acaso: http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html
Supongamos que tengo la cadena:
my_data = ''/x00/x00/x80?/x00/x00/x00@/x00/x00@@/x00/x00/x80@''
El lugar donde lo obtuve es irrelevante, pero por el simple hecho de tener algo concreto, asuma que lo leí de un archivo binario.
Sé que mi cadena es la representación binaria de 4 (4 bytes) flotantes. Me gustaría obtener esos flotadores como una matriz numpy. Yo podria hacer
import struct
import numpy as np
tple = struct.unpack( ''4f'', my_data )
my_array = np.array( tple, dtype=np.float32 )
Pero parece tonto crear una tupla intermedia. ¿Hay una manera de hacer esta operación sin crear una tupla intermedia?
EDITAR
También me gustaría poder construir la matriz de tal manera que pueda especificar la endianidad de la cadena.