31

假设我有字符串:

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 )

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

编辑

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

4

2 回答 2

45
>>> np.frombuffer(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)

或者,如果你想要大端:

>>> np.frombuffer(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)

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

事实上,如果你真的使用二进制文件来加载数据,你甚至可以跳过 using-a-string 步骤,直接从带有numpy.fromfile().

此外,dtype 参考,以防万一:http ://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html

于 2012-08-01T13:19:31.063 回答
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.]
于 2020-12-05T23:38:04.713 回答