【问题标题】:convert binary string to numpy array将二进制字符串转换为numpy数组
【发布时间】:2012-08-01 13:14:37
【问题描述】:

假设我有字符串:

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 )

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

编辑

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

【问题讨论】:

  • @Aurelius 我会说这很接近,但不是完全重复。虽然答案相似,但这个问题是关于浮点数的,而这个问题是关于整数的。

标签: python numpy binary-data


【解决方案1】:
>>> 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)

当然,在 Python 3 之前,b 不是必需的。

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

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

【讨论】:

  • 这太棒了。 (谢谢)。我可以看到的一个缺点是无法指定字节顺序。有什么想法吗?
  • 在 dtype 中指定字节顺序。 np.dtype('&lt;f4') 用于小端(尽管这是默认设置,因此除了代码清晰性之外没有必要),np.dtype('&gt;f4') 用于大端。所以np.fromstring(b'\x00\x00\x80?\x00\x00\x00@\x00\x00@@\x00\x00\x80@', dtype=np.dtype('&gt;f4')) 的结果是array([4.60060299e-41, 8.96831017e-44, 2.30485571e-41, 4.60074312e-41], dtype=float32)。参考:docs.scipy.org/doc/numpy/reference/arrays.dtypes.html
  • 完美。正是我想要的。
  • 我认为您应该将有关字节序转换的内容添加到您的答案中。我认为这也可能对其有相同问题的其他人有所帮助,因此将其放在比评论中更突出的位置是有意义的。
  • @JAB - +1。注意 - 我不认为 little-endian 是默认设置。相反,机器类型是默认值。因此,如果您使用的是大端机器(现在很少见)并且正在读取小端字符串,则需要指定'
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2020-07-12
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    相关资源
    最近更新 更多