如何从字节中创建一个numpy ndarray?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从字节中创建一个numpy ndarray?相关的知识,希望对你有一定的参考价值。
我可以使用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]])
答案
编辑后,你似乎走错了方向!
当仅需要从这些字节重建时,您不能使用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在内存中使用字节字符串。
另一答案
要反序列化你需要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..."
以上是关于如何从字节中创建一个numpy ndarray?的主要内容,如果未能解决你的问题,请参考以下文章