2011-06-26 42 views
14

Tôi hiện đang cố gắng tìm ra cách tôi có thể khôi phục mảng numpy từ dữ liệu base64. Câu hỏi và câu trả lời này cho thấy có thể: Reading numpy arrays outside of Python nhưng một ví dụ không được đưa ra.Numpy Array đến base64 và quay lại Numpy Array - Python

Sử dụng mã bên dưới làm ví dụ, làm cách nào tôi có thể nhận mảng Numpy từ dữ liệu base64 nếu tôi biết dtype và hình dạng của mảng?

import base64 
import numpy as np 

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

Tôi muốn có một câu lệnh python để đặt q là mảng numpy của float64 dtype do đó kết quả là một mảng giống với t. Đây là những gì các mảng mã hóa và giải mã như sau:

>>> 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\[email protected]\x00\x00\x00\x00\x00\[email protected]\x00\x00\x00\x00\x00\[email protected]' 
>>> q = np.array(???? 

Lý do tôi hỏi là vì tôi đang làm việc trên một dự án mà tôi muốn để lưu trữ rất nhiều mảng NumPy trong một cơ sở dữ liệu MySQL trong một ứng dụng được hỗ trợ bởi django.

Sử dụng django này đoạn mã tôi có thể lưu trữ dữ liệu base64 trong một textfield: http://djangosnippets.org/snippets/1669/

Tôi muốn viết các mảng cơ sở dữ liệu dưới dạng base64 thay vì chuyển đổi các mảng thành một chuỗi của unicode.

Cảm ơn sự giúp đỡ của bạn.

Trả lời

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

Cảm ơn bạn rất nhiều. – sequoia

+2

Tôi cũng sẽ thêm rằng tôi đã thực hiện công việc này cho các mảng đa chiều bằng cách áp dụng q = np.reshape (q, (m, n)), trong đó m và n trong đó các kích thước ban đầu của mảng t. – sequoia

+0

Xử lý mảng đa chiều khiến tôi mất cảnh giác - b64encode đã trả về kết quả cho các mảng đa chiều, nhưng các mảng đó không chứa mảng "bên trong" ... đáng sợ. Cảm ơn các con trỏ tuyệt vời! –