与numpy.recarray.tobytes
相反的是什么?
>>> import numpy as np
>>> A = np.array([(28483,27759)],dtype=[('x','<u2'),('y','<u2')])
>>> A.tobytes()
'Cool'
这里A
是一个4字节的结构化数组,tobytes
允许我以二进制形式序列化它。如何获取适当大小的二进制字符串并在给定dtype
对象的情况下对其进行反序列化?
答案 0 :(得分:2)
我怀疑你想要frombuffer
,它将字节字符串(或者更常见的是支持buffer protocol的任何Python对象)解释为数组。默认情况下,它假设dtype
为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')])
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,这只是一个具有结构化dtype的常规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)