您可以使用 .tobytes()
函数将 numpy 数组转换为字节。
如何将它从这个字节数组解码回 numpy 数组?我这样尝试形状为 (28,28) 的数组 i
>>k=i.tobytes()
>>np.frombuffer(k)==i
False
也尝试使用 uint8 。
原文由 Gautham Santhosh 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用 .tobytes()
函数将 numpy 数组转换为字节。
如何将它从这个字节数组解码回 numpy 数组?我这样尝试形状为 (28,28) 的数组 i
>>k=i.tobytes()
>>np.frombuffer(k)==i
False
也尝试使用 uint8 。
原文由 Gautham Santhosh 发布,翻译遵循 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 许可协议
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
你在做什么的几个问题:
frombuffer
将始终将输入解释为一维数组。这是 文档 的第一行。所以你必须重塑为(28, 28)
。默认
dtype
是float
。因此,如果您没有序列化浮点数,则必须手动指定dtype
(先验的,没有人能说出字节流的含义:您必须说出它们代表什么)。如果要确保数组相等,则必须使用
np.array_equal
。使用==
将执行逐元素操作,并返回numpy
数组(这可能不是您想要的)。例子:
HTH。