2011-06-26 78 views
14

我现在试图找出如何从base64数据恢复numpy数组。这个问题和答案表明它是可能的:Reading numpy arrays outside of Python,但没有给出一个例子。numpy数组到base64并返回到Numpy数组 - Python

以下面的代码为例,如果我知道dtype和数组的形状,如何从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\[email protected]\x00\x00\x00\x00\x00\x00\[email protected]\x00\x00\x00\x00\x00\x00\[email protected]\x00\x00\x00\x00\x00\x00\[email protected]\x00\x00\x00\x00\x00\x00\[email protected]\x00\x00\x00\x00\x00\x00\[email protected]\x00\x00\x00\x00\x00\x00 @\x00\x00\x00\x00\x00\x00"@\x00\x00\x00\x00\x00\[email protected]\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\[email protected]\x00\x00\x00\x00\x00\[email protected]\x00\x00\x00\x00\x00\[email protected]\x00\x00\x00\x00\x00\[email protected]\x00\x00\x00\x00\x00\[email protected]\x00\x00\x00\x00\x00\[email protected]\x00\x00\x00\x00\x00\[email protected]\x00\x00\x00\x00\x00\x006@\x00\x00\x00\x00\x00\[email protected]\x00\x00\x00\x00\x00\[email protected]' 
>>> q = np.array(???? 

我要求的原因是因为我上一个项目,我想了很多numpy的阵列存储在MySQL数据库中的应用供电工作由django。

使用这个片断的Django我可以存储在一个文本框的base64数据:http://djangosnippets.org/snippets/1669/

我想要写的,而不是转换阵列Unicode字符为base64的阵列添加到数据库中。

感谢您的帮助。

回答

20
import base64 
import numpy as np 

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

print(np.allclose(q, t)) 
# True 
+0

非常感谢。 – sequoia

+2

我还会补充说我通过应用q = np.reshape(q,(m,n))来完成多维数组的工作,其中m和n是t数组的原始维数。 – sequoia

+0

多维数组处理引起了我的警惕 - b64encode返回了多维数组的结果,但这些数组不包含“内部”数组......可怕。感谢伟大的指针! –