numpy.recarray.tobytes 的逆

Jas*_*n S 5 python numpy

的相反数是什么numpy.recarray.tobytes

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

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

Mar*_*son 5

我怀疑你想要将frombuffer字节串(或者更一般地说,任何支持缓冲区协议的Python对象)解释为数组。默认情况下,它假定为dtypeof np.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')])
Run Code Online (Sandbox Code Playgroud)

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

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

如果您想要可写的内容,请使用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')])
Run Code Online (Sandbox Code Playgroud)

请参阅此答案以获取更多信息。

如果您想要一个真正的 NumPy记录数组(而不是结构化数组,它只是ndarray具有结构化 dtype 的常规数组),您可以将结果传递给nd.rec.array

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

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

>>> B = np.rec.array(A)
>>> B.x
array([28483], dtype=uint16)
Run Code Online (Sandbox Code Playgroud)