我不确定您要完成什么,但是您可以对任何具有
bytes
陈述。在给出的示例中,您将numpy数组编码为base64。
这是因为numpy数组具有
字节
形式。你可以用两种方法
bytes()
在数组周围或使用
.tobytes()
方法。
import numpy as np
x = np.array([1,2,3])
bytes(x)
# returns:
b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00'
x.tobytes()
# returns:
b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00'
因为我们有一个
字节
数组的表示,可以将其传递给base64编码器。注意,如果对象不是一个类似字节的对象,它将
base64
将尝试在编码前转换它,如下例所示:
base64.b64encode(x)
# returns
b'AQAAAAIAAAADAAAA'
base64.b64encode(x.tobytes())
# returns
b'AQAAAAIAAAADAAAA'
字节数组没有什么特别的。它只是一个数字序列!就这样。您没有恢复numpy数组的原因是因为编码解码过程仍然会让您得到
x.tobytes()
不
x
本身。
要返回原始对象,需要一个可以读取字节序列并返回某种类型对象的接口。幸运的是,numpy可以通过
frombuffer
功能。但是,您需要告诉numpy它正在以字节的形式读取的数组类型。
换句话说,你可以
int32
数组和
int16
数组具有相同的字节表示,但要恢复正确的字节表示,需要告诉numpy哪种类型是正确的。所以你需要一些关于物体的知识。
x = np.array([1,2,3])
# encode as base 64
x_64 = base64.b64encode(x.tobytes())
# decode back to bytes
x_bytes = base64.b64decode(x_64)
# use numpy to recreate original array of ints
np.frombuffer(x_bytes, dtype=int)
# returns:
np.array([1, 2, 3])
如果您希望保存一个对象,然后在以后恢复它,那么这个过程称为序列化。有两个处理序列化的非常好的包,第一个在标准库中,调用
pickle
,第二个被称为
dill
可以处理更复杂的物体。
import pickle
x = np.array([1,2,3])
pickled_x = pickle.dumps(x)
# pickled_x is a bytes-object that is a hard to read by humans.
pickle.loads(x)
# returns:
np.array([1, 2, 3])