Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Numpy数组到base64并返回到Numpy数组-Python_Python_Django_Arrays_Numpy_Base64 - Fatal编程技术网

Numpy数组到base64并返回到Numpy数组-Python

Numpy数组到base64并返回到Numpy数组-Python,python,django,arrays,numpy,base64,Python,Django,Arrays,Numpy,Base64,我现在正试图找出如何从base64数据恢复numpy阵列。这个问题和答案表明这是可能的:但没有给出一个例子 以下面的代码为例,如果我知道数组的数据类型和形状,如何从base64数据中获取Numpy数组 import base64 import numpy as np t = np.arange(25, dtype=np.float64) s = base64.b64encode(t) r = base64.decodestring(s) q = ????? 我需要一个python语句将q设

我现在正试图找出如何从base64数据恢复numpy阵列。这个问题和答案表明这是可能的:但没有给出一个例子

以下面的代码为例,如果我知道数组的数据类型和形状,如何从base64数据中获取Numpy数组

import base64
import numpy as np

t = np.arange(25, dtype=np.float64)
s = base64.b64encode(t)
r = base64.decodestring(s)
q = ????? 
我需要一个python语句将q设置为dtype float64的numpy数组,因此结果是一个与t相同的数组。这就是编码和解码的数组的样子:

>>> t = np.arange(25,dtype=np.float64)
>>> t
array([  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.,
    11.,  12.,  13.,  14.,  15.,  16.,  17.,  18.,  19.,  20.,  21.,
    22.,  23.,  24.])
>>> s=base64.b64encode(t)
>>> s
'AAAAAAAAAAAAAAAAAADwPwAAAAAAAABAAAAAAAAACEAAAAAAAAAQQAAAAAAAABRAAAAAAAAAGEAAAAAAAAAcQAAAAAAAACBAAAAAAAAAIkAAAAAAAAAkQAAAAAAAACZAAAAAAAAAKEAAAAAAAAAqQAAAAAAAACxAAAAAAAAALkAAAAAAAAAwQAAAAAAAADFAAAAAAAAAMkAAAAAAAAAzQAAAAAAAADRAAAAAAAAANUAAAAAAAAA2QAAAAAAAADdAAAAAAAAAOEA='
>>> r = base64.decodestring(s)
>>> r
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00\x10@\x00\x00\x00\x00\x00\x00\x14@\x00\x00\x00\x00\x00\x00\x18@\x00\x00\x00\x00\x00\x00\x1c@\x00\x00\x00\x00\x00\x00 @\x00\x00\x00\x00\x00\x00"@\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x00&@\x00\x00\x00\x00\x00\x00(@\x00\x00\x00\x00\x00\x00*@\x00\x00\x00\x00\x00\x00,@\x00\x00\x00\x00\x00\x00.@\x00\x00\x00\x00\x00\x000@\x00\x00\x00\x00\x00\x001@\x00\x00\x00\x00\x00\x002@\x00\x00\x00\x00\x00\x003@\x00\x00\x00\x00\x00\x004@\x00\x00\x00\x00\x00\x005@\x00\x00\x00\x00\x00\x006@\x00\x00\x00\x00\x00\x007@\x00\x00\x00\x00\x00\x008@'
>>> q = np.array( ????
我问这个问题的原因是因为我正在做一个项目,我想在django支持的应用程序中,在MySQL数据库中存储大量Numpy数组

使用此django代码段,我可以将base64数据存储在文本字段中:

我希望将数组作为base64写入数据库,而不是将数组转换为unicode字符串


谢谢您的帮助。

下面的代码将其编码为base64。它将处理任何类型/大小的numpy数组,而不需要记住它是什么。它还将处理其他可以pickle的任意对象

import base64
import numpy as np

t = np.arange(25, dtype=np.float64)
s = base64.b64encode(t)
r = base64.decodebytes(s)
q = np.frombuffer(r, dtype=np.float64)

print(np.allclose(q, t))
# True
import numpy as np
import pickle
import codecs

obj = np.random.normal(size=(10, 10))
obj_base64string = codecs.encode(pickle.dumps(obj, protocol=pickle.HIGHEST_PROTOCOL), "base64").decode('latin1')
obj_reconstituted = pickle.loads(codecs.decode(obj_base64string.encode('latin1'), "base64"))

如果您只需要原始字节,可以删除.decode('latin1')和.encode('latin1')。

我还将补充一点,我已经通过应用q=np.reformate(q,(m,n)),对多维数组进行了这项工作,其中m和n是t数组的原始维度。多维数组处理让我措手不及——b64encode正在返回多维数组的结果,但这些数组不包含“内部”数组。。。吓人的。谢谢你的指点!回到这里再加上一个警告(因为我刚刚被它咬了一口)。小心你的numpy数据类型不是float64。例如,如果源numpy数组仅包含int,则上面的代码将很乐意对其进行编码和解码。但是最终的结果将是完全错误的,并且不会有任何警告(我知道我应该小心,但是会发生无声的错误&这些错误很烦人/危险)-/
q=np.frombuffer(r,dtype=np.int32)
中使用的“解码”数据类型必须与传递到
base64.b64encode(t)
的原始数组
t=np.arange(25,dtype=np.int32)
的数据类型匹配。
float64本身没有什么特别之处。