python - numpy.recarray.tobytes 的逆

标签 python numpy

numpy.recarray.tobytes 的逆是什么?

>>> import numpy as np
>>> A = np.array([(28483,27759)],dtype=[('x','<u2'),('y','<u2')])
>>> A.tobytes()
'Cool'

这里A是一个4字节的结构化数组,tobytes让我可以将它以二进制形式序列化。如何获取适当大小的二进制字符串并在给定 dtype 对象的情况下反序列化它?

最佳答案

我怀疑你想要frombuffer ,它将字节串(或者更一般地说,任何支持 buffer protocol 的 Python 对象)解释为数组。默认情况下,它假定 dtypenp.float64,但您可以指定特定的 dtype,包括结构化 dtype >.

>>> import numpy as np
>>> A = np.frombuffer(b"Cool", dtype=[('x','<u2'),('y','<u2')])
>>> A
array([(28483, 27759)],
      dtype=[('x', '<u2'), ('y', '<u2')])

frombuffer 的一个怪癖是它创建一个直接引用您提供的字节的数组,而不是复制它们。这意味着,如果您在 Python 字节字符串上使用它(例如),则生成的数组将是只读的:

>>> A["x"] = 23
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: assignment destination is read-only

如果您想要可写的内容,请使用 np.fromstring而不是np.frombuffer:

>>> A = np.fromstring(b"Cool", dtype=[('x','<u2'),('y','<u2')])
>>> A["x"] = 23
>>> A
array([(23, 27759)],
      dtype=[('x', '<u2'), ('y', '<u2')])

参见this answer了解更多信息。

如果你想要一个正版的 NumPy record array (而不是 structured array ,它只是具有结构化数据类型的常规 ndarray ),您可以将结果传递给 nd.rec.array :

>>> np.rec.array(A)
rec.array([(28483, 27759)], 
          dtype=[('x', '<u2'), ('y', '<u2')])

记录数组很像结构化数组,但有自己的 ndarray 子类,并允许通过属性访问检索字段:

>>> B = np.rec.array(A)
>>> B.x
array([28483], dtype=uint16)

关于python - numpy.recarray.tobytes 的逆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47720307/

相关文章:

python - 我的 python 脚本和 cron 作业有什么问题?

python - 使用 PyTorch nn.Sequential() 以灵活的方式定义网络,但结果超出预期

python - 在 pip.conf 中指定多个可信主机

python - 在 python Flask 应用程序中进行单元测试时如何避免装饰器

python - 将 Numpy 中的矩阵列表相乘

python - 遍历numpy中的任意维度

python - 为 CSV 文件附加标题?

python - 使用python,如何使用字典更改列表的值

python - 使用 pybind11 将 NumPy 数组转换到自定义 C++ 矩阵类或从自定义 C++ 矩阵类转换

python - Numpy 子数组的外部添加