10

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].

1
  • Example of the data structure you're working with? Commented Nov 3, 2010 at 19:45

3 Answers 3

21

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.

Sign up to request clarification or add additional context in comments.

7 Comments

Is there a way to make it read two bytes at a time instead of one?
That's neat - I didn't know about that method within numpy. I just gave it a try and am getting array([ 1, 5, 3, -1], dtype=int8) back instead. Any idea what might be causing this ?
To read two bytes at a time instead of one, you can change the dtype argument to something else like 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().
I get a deprecation warning with this method now: DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead
@Bill thanks for pointing that out. I've updated the answer for a Python3-safe version with bytestrings and frombuffer.
|
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])

Comments

1

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(','))

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.