从以前的 ndarray.tobytes() 转换回 ndarray?

Hip*_*Man 5 python byte numpy deserialization

使用 numpy 时,假设我有一个任意的、以前创建的ndarray名为my_ndarray. 如果可能的话,我希望能够执行以下操作...

my_bytes = my_ndarray.tobytes()
new_ndarray = ## ... somehow convert `my_bytes` back to a `nympy.ndarray`
## ... such that `my_ndarray` and `new_ndarray` are equal
assert(numpy.equal(my_ndarray, new_ndarray)) # I expect this to succeed
Run Code Online (Sandbox Code Playgroud)

有什么方法可以反序列化通过返回到一个有意义的特别创建的东西吗?tobytes()ndarray

还是我不得不使用其他形式的序列化/反序列化?

cs9*_*s95 8

您可以使用np.frombuffer

new_ndarray = np.frombuffer(my_bytes)
Run Code Online (Sandbox Code Playgroud)

演示(python2):

>>> x = np.random.randn(10)
>>> my_bytes = x.tobytes()
>>> my_bytes
b'\x8d\x10\xfe\x1e\xaa^\xa0\xbfw\xa26\xca\xbc\xb1\xf5\xbf\x06(C\xe4\x9d\xb9\xae?\xed9\x170rZ\xe9?\x1c\x99\xd5TQ\xbe\xc5\xbfk\xd42\xb3(\xbb\xf3\xbf\xc7K.L\x1fu\xe5\xbfHE\xc2H~\xca\xdd\xbf\xe79\xdfJ\xeec\xf7\xbf\xe3\x9ds\x88\xbe\x1c\xf4\xbf' 
>>> np.frombuffer(my_bytes)
array([-0.03197223, -1.35589293,  0.06000989,  0.79229078, -0.16987054,
       -1.23319311, -0.67054715, -0.46548421, -1.46189718, -1.25701764])
Run Code Online (Sandbox Code Playgroud)

  • 您应该知道返回的 dtype,默认情况下 frombuffer 使用 float,因此,这应该更改以匹配正在编码的原始数组。否则,您将不会得到相同的结果。 (4认同)
  • 您还需要知道形状。`np.frombuffer(my_bytes, dtype=___).reshape(shape)` 是处理多于一维数组所必需的。 (3认同)