I have a file reader that reads n bytes from a file and returns a string of chars representing that (binary) data. I want to read up n bytes into a numpy array of numbers and run a FFT on it, but I'm having trouble creating an array from a string. A couple lines of example would be awesome.
Edit:
I'm reading raw binary data, and so the string I get looks like '\x01\x05\x03\xff'.... I want this to become [1, 5, 3, 255].
-
Example of the data structure you're working with?g.d.d.c– g.d.d.c2010年11月03日 19:45:02 +00:00Commented Nov 3, 2010 at 19:45
3 Answers 3
In Python 2, you can do this directly with numpy.fromstring:
import numpy as np
s = '\x01\x05\x03\xff'
a = np.fromstring(s, dtype='uint8')
Once completing this, a is array([ 1, 5, 3, 255]) and you can use the regular scipy/numpy FFT routines.
In Python 3, the switch to default Unicode strings means that you would read in the data as a bytestring and use the frombuffer command instead:
import numpy as np
s = b'\x01\x05\x03\xff'
a = np.frombuffer(s, dtype='uint8')
to get the same results.
7 Comments
array([ 1, 5, 3, -1], dtype=int8) back instead. Any idea what might be causing this ?int16, uint16 - once you get into multiple-byte strings, though, you may have to byteswap the output in order to get the byte ordering correctly. Just replace a = np.fromstring(...) with a = np.fromstring(...).byteswap().DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer insteadfrombuffer.>>> '\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])
Comments
Without knowing what you've got coming in it's tough, but if it were comma delimited integers you could do something like this:
myInts = map(int, myString.split(','))