如何从字节中创建一个numpy ndarray?

问题描述 投票:1回答:2

我可以使用myndarray.tobytes()将numpy ndarray转换为字节现在我怎样才能将它恢复为ndarray?

使用.tobytes()方法文档中的示例:

>>> x = np.array([[0, 1], [2, 3]])
>>> bytes = x.tobytes()
>>> bytes
b'\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00'

>>> np.some_magic_function_here(bytes)
array([[0, 1], [2, 3]])
python numpy
2个回答
2
投票

编辑后,你似乎走错了方向!

当仅需要从这些字节重建时,您不能使用np.tobytes()来存储包含形状和类型等所有信息的完整数组!它只会保存原始数据(单元格值)并将它们以C或Fortran顺序展平。

现在我们不知道你的任务。但是你需要基于序列化的东西。有很多方法,最简单的方法是基于python的pickle(例如:python3!):

import pickle
import numpy as np

x = np.array([[0, 1], [2, 3]])
print(x)

x_as_bytes = pickle.dumps(x)
print(x_as_bytes)
print(type(x_as_bytes))

y = pickle.loads(x_as_bytes)
print(y)

输出:

[[0 1]
 [2 3]]
 b'\x80\x03cnumpy.core.multiarray\n_reconstruct\nq\x00cnumpy\nndarray\nq\x01K\x00\x85q\x02C\x01bq\x03\x87q\x04Rq\x05(K\x01K\x02K\x02\x86q\x06cnumpy\ndtype\nq\x07X\x02\x00\x00\x00i8q\x08K\x00K\x01\x87q\tRq\n(K\x03X\x01\x00\x00\x00<q\x0bNNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tq\x0cb\x89C \x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00q\rtq\x0eb.'
<class 'bytes'>
[[0 1]
 [2 3]]

更好的选择是joblib's泡菜与大型阵列的专门酸洗。 joblib的函数是基于文件对象的,并且可以使用python的BytesIO在内存中使用字节字符串。


0
投票

要反序列化你需要np.frombuffer()的字节。 tobytes()将数组序列化为字节,np.frombuffer()将它们反序列化。

请记住,一旦序列化,形状信息就会丢失,这意味着在反序列化之后,需要将其重新整形为原始形状。

以下是一个完整的例子:

import numpy as np

x = np.array([[0, 1], [2, 3]], np.int8)
bytes = x.tobytes()
# bytes is a raw array, which means it contains no info regarding the shape of x
# let's make sure: we have 4 values with datatype=int8 (one byte per array's item), therefore the length of bytes should be 4bytes
assert len(bytes) == 4, "Ha??? Weird machine..."

deserialized_bytes = np.frombuffer(bytes, dtype=np.int8)
deserialized_x = np.reshape(deserialized_bytes, newshape=(3, 2))
assert np.array_equal(x, deserialized_x), "Deserialization failed..."
© www.soinside.com 2019 - 2024. All rights reserved.