将二进制字符串转换为numpy数组

时间:2012-08-01 13:14:38

标签: python numpy binary-data

假设我有字符串:

my_data = '\x00\x00\x80?\x00\x00\x00@\x00\x00@@\x00\x00\x80@'

我得到它是无关紧要的,但为了有一些具体的东西,假设我从二进制文件中读取它。

我知道我的字符串是4(4字节)浮点数的二进制表示。我想把这些花车作为一个numpy阵列。我可以做:

import struct
import numpy as np
tple = struct.unpack( '4f', my_data )
my_array = np.array( tple, dtype=np.float32 )

但是创建一个中级元组似乎很愚蠢。有没有办法在不创建中间元组的情况下执行此操作?

修改

我还希望能够以这样的方式构造数组,以便指定字符串的字节顺序。

2 个答案:

答案 0 :(得分:36)

>>> 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)

或者,如果你想要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)

当然,在Python 3之前不需要b

实际上,如果您实际上使用的是二进制文件来加载数据,您甚至可以跳过using-a-string步骤并使用numpy.fromfile()直接从文件加载数据。

另外,dtype引用,以防万一:http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html

答案 1 :(得分:0)

np.fromstring()已过时。请改用np.frombuffer()

import numpy as np

my_data = b'\x00\x00\x80?\x00\x00\x00@\x00\x00@@\x00\x00\x80@'

# np.fromstring is deprecated
# data = np.fromstring(my_data, np.float32)
data = np.frombuffer(my_data, np.float32)

print(data)
[1. 2. 3. 4.]