convert binary string to numpy array
Question:
Assume I have the string:
my_data = 'x00x00x80?x00x00x00@x00x00@@x00x00x80@'
Where I got it is irrelevant, but for the sake of having something concrete, assume I read it from a binary file.
I know my string is the binary representation of 4 (4-byte) floats. I would like to get those floats as a numpy array. I could do:
import struct
import numpy as np
tple = struct.unpack( '4f', my_data )
my_array = np.array( tple, dtype=np.float32 )
But it seems silly to create an intermediate tuple. Is there a way to do this operation without creating an intermediate tuple?
EDIT
I would also like to be able to construct the array in such a way that I can specify the endianness of the string.
Answers:
>>> np.frombuffer(b'x00x00x80?x00x00x00@x00x00@@x00x00x80@', 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)
Or, if you want big-endian:
>>> np.frombuffer(b'x00x00x80?x00x00x00@x00x00@@x00x00x80@', 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)
The b
isn’t necessary prior to Python 3, of course.
In fact, if you actually are using a binary file to load the data from, you could even skip the using-a-string step and load the data directly from the file with numpy.fromfile()
.
Also, dtype reference, just in case: http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html
np.fromstring()
is deprecated. Use np.frombuffer()
instead.
import numpy as np
my_data = b'x00x00x80?x00x00x00@x00x00@@x00x00x80@'
# np.fromstring is deprecated
# data = np.fromstring(my_data, np.float32)
data = np.frombuffer(my_data, np.float32)
print(data)
[1. 2. 3. 4.]
Assume I have the string:
my_data = 'x00x00x80?x00x00x00@x00x00@@x00x00x80@'
Where I got it is irrelevant, but for the sake of having something concrete, assume I read it from a binary file.
I know my string is the binary representation of 4 (4-byte) floats. I would like to get those floats as a numpy array. I could do:
import struct
import numpy as np
tple = struct.unpack( '4f', my_data )
my_array = np.array( tple, dtype=np.float32 )
But it seems silly to create an intermediate tuple. Is there a way to do this operation without creating an intermediate tuple?
EDIT
I would also like to be able to construct the array in such a way that I can specify the endianness of the string.
>>> np.frombuffer(b'x00x00x80?x00x00x00@x00x00@@x00x00x80@', 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)
Or, if you want big-endian:
>>> np.frombuffer(b'x00x00x80?x00x00x00@x00x00@@x00x00x80@', 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)
The b
isn’t necessary prior to Python 3, of course.
In fact, if you actually are using a binary file to load the data from, you could even skip the using-a-string step and load the data directly from the file with numpy.fromfile()
.
Also, dtype reference, just in case: http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html
np.fromstring()
is deprecated. Use np.frombuffer()
instead.
import numpy as np
my_data = b'x00x00x80?x00x00x00@x00x00@@x00x00x80@'
# np.fromstring is deprecated
# data = np.fromstring(my_data, np.float32)
data = np.frombuffer(my_data, np.float32)
print(data)
[1. 2. 3. 4.]