gpt4 book ai didi

Python base64编码然后解码通用对象

转载 作者:太空狗 更新时间:2023-10-30 02:37:18 26 4
gpt4 key购买 nike

我正在尝试将 numpy.ndarray 转换为 base64,然后再将其转换回来。base64 库是要走的路吗?下面非常简单的代码甚至不能按预期工作。我错过了什么?

import numpy as np

x = np.array([[1, 2, 3], [4, 5, 6]], np.int32)
print(x)
print(type(x))

encoded = base64.b64encode(x)
decoded = base64.b64decode(encoded)
print(decoded)
print(type(decoded))

有没有办法取回原来的变量?

一般的问题是:我可以将“任何”对象转换为二进制字符串,然后再转换回原始类型吗?

我也许可以使用 pickle 但我需要一种压缩格式(不在文件中):像

x_compressed = zipped(pickle.dumps(x))

最佳答案

我不确定您要完成什么,但是您可以对任何具有 bytes 表示形式的对象进行 base-64 编码。在您给出的示例中,您正在将一个 numpy 数组编码为 base64。

这是可行的,因为 numpy 数组具有 bytes 形式。您可以通过将 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'

因为我们有数组的 bytes 表示,您可以将它传递给 base64 编码器。请注意,如果对象不是类字节对象,它会 base64 尝试在编码之前对其进行转换,如下例所示:

base64.b64encode(x)
# returns
b'AQAAAAIAAAADAAAA'

base64.b64encode(x.tobytes())
# returns
b'AQAAAAIAAAADAAAA'

字节数组没什么特别的。这只是一个数字序列!就是这样。你之所以没有恢复 numpy 数组是因为编码解码过程仍然只给你留下 x.tobytes() 而不是 x 本身的结果。

要取回原始对象,您需要一个可以读取字节序列并返回某种对象的接口(interface)。幸运的是,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])

关于Python base64编码然后解码通用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50519583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com