2010-11-03 25 views
10

Tengo un lector de archivos que lee n bytes desde un archivo y devuelve una cadena de caracteres que representan los datos (binarios). Quiero leer n bytes en una matriz numpy de números y ejecutar una FFT en ella, pero tengo problemas para crear una matriz a partir de una cadena. Un par de líneas de ejemplo sería increíble.¿Cómo creo una matriz numpy a partir de una cadena?

Editar: estoy leyendo datos binarios sin formato, y así la cadena que se parece a conseguir '\x01\x05\x03\xff'.... Quiero que esto se convierta en [1, 5, 3, 255].

+0

¿Algún ejemplo de esa cadena? – kennytm

+0

Ejemplo de la estructura de datos con la que está trabajando? –

Respuesta

20

Usted puede hacer esto directamente con numpy.fromstring:

import numpy as np 
s = '\x01\x05\x03\xff' 
a = np.fromstring(s, dtype='uint8') 

Una vez que haya completado esto, a es array([ 1, 5, 3, 255]) y puede usar las rutinas scipy/numpy normales de FFT.

+0

¿Hay alguna forma de hacerlo leer dos bytes a la vez en lugar de uno? – erjiang

+0

Eso está bien, no sabía acerca de ese método en numpy. Solo lo probé y estoy obteniendo 'array ([1, 5, 3, -1], dtype = int8)' en su lugar. Alguna idea de lo que podría estar causando esto ? – dtlussier

+0

Para leer dos bytes a la vez en lugar de uno, puede cambiar el argumento dtype por otra cosa como 'int16',' uint16'; una vez que entra en cadenas de bytes múltiples, puede que deba byteswap la salida en orden para obtener el orden de bytes correctamente. Simplemente reemplace 'a = np.fromstring (...)' con 'a = np.fromstring (...). Byteswap()'. –

1

Sin saber lo que tienes que entra es difícil, pero si fuera por comas enteros delimitada se podría hacer algo como esto:

myInts = map(int, myString.split(',')) 
5
>>> '\x01\x05\x03\xff' 
'\x01\x05\x03\xff' 
>>> map(ord, '\x01\x05\x03\xff') 
[1, 5, 3, 255] 
>>> numpy.array(map(ord, '\x01\x05\x03\xff')) 
array([ 1, 5, 3, 255]) 
Cuestiones relacionadas