将字节数组转换回 numpy 数组

新手上路,请多包涵

您可以使用 .tobytes() 函数将 numpy 数组转换为字节。

如何将它从这个字节数组解码回 numpy 数组?我这样尝试形状为 (28,28) 的数组 i

>>k=i.tobytes()

>>np.frombuffer(k)==i

False

也尝试使用 uint8 。

原文由 Gautham Santhosh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

你在做什么的几个问题:

  1. frombuffer 将始终将输入解释为一维数组。这是 文档 的第一行。所以你必须重塑为 (28, 28)

  2. 默认 dtypefloat 。因此,如果您没有序列化浮点数,则必须手动指定 dtype (先验的,没有人能说出字节流的含义:您必须说出它们代表什么)。

  3. 如果要确保数组相等,则必须使用 np.array_equal 。使用 == 将执行逐元素操作,并返回 numpy 数组(这可能不是您想要的)。

如何将它从这个字节数组解码回 numpy 数组?

例子:

 In [3]: i = np.arange(28*28).reshape(28, 28)

In [4]: k = i.tobytes()

In [5]: y = np.frombuffer(k, dtype=i.dtype)

In [6]: y.shape
Out[6]: (784,)

In [7]: np.array_equal(y.reshape(28, 28), i)
Out[7]: True

HTH。

原文由 Matt Messersmith 发布,翻译遵循 CC BY-SA 4.0 许可协议

虽然您可以使用 tobytes() ,但它不是理想的方法,因为它不存储 numpy 数组的形状信息。

如果您必须将其发送到另一个您没有形状信息的进程,则必须显式发送形状信息。

一个更优雅的解决方案是使用 --- 将其保存到 BytesIO 缓冲区,并使用 np.load np.save 恢复。在这种情况下,您不需要在任何地方专门存储形状信息,并且可以轻松地从字节值中恢复您的 numpy 数组。

例子:

 >>> import numpy as np
>>> from io import BytesIO

>>> x = np.arange(28*28).reshape(28, 28)
>>> x.shape
(28, 28)

# save in to BytesIo buffer
>>> np_bytes = BytesIO()
>>> np.save(np_bytes, x, allow_pickle=True)

# get bytes value
>>> np_bytes = np_bytes.getvalue()
>>> type(np_bytes)
<class 'bytes'>

# load from bytes into numpy array
>>> load_bytes = BytesIO(np_bytes)
>>> loaded_np = np.load(load_bytes, allow_pickle=True)

# shape is preserved
>>> loaded_np.shape
(28, 28)

# both arrays are equal without sending shape
>>> np.array_equal(x,loaded_np)
True

原文由 Saket Kumar Singh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题