2011-06-26 79 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返回了多維數組的結果,但這些數組不包含「內部」數組......可怕。感謝偉大的指針! –