2013-07-10 30 views
7

Trong chương trình của tôi, tôi đang làm việc với nhiều mảng có kích thước khác nhau. Tôi cần lưu trữ chúng vào các tệp XML để sử dụng sau này. Tôi đã không viết chúng vào các tệp nhị phân vì vậy tôi có tất cả dữ liệu của tôi ở một nơi (tệp XML) và không phân tán qua 200 tệp.Lưu trữ và tải các mảng có nhiều mảng như các tập tin

Vì vậy, tôi đã cố gắng sử dụng phương thức array_str() của numpy để chuyển đổi một mảng thành một Chuỗi. Kết quả XML trông giống như sau:

-<Test date="2013-07-10-17:19"> 
    <Neurons>5</Neurons> 
    <Errors>[7.7642140551985428e-06, 7.7639131137987232e-06]</Errors> 
    <Iterations>5000</Iterations> 
    <Weights1>[[ 0.99845902 -0.70780512 0.26981375 -0.6077122 0.09639695] [ 0.61856711 -0.74684913 0.20099992 0.99725171 -0.41826754] [ 0.79964397 0.56620812 -0.64055346 -0.50572793 -0.50100635]]</Weights1> 
    <Weights2>[[-0.1851452 -0.22036027] [ 0.19293429 -0.1374252 ] [-0.27638478 -0.38660974] [ 0.30441414 -0.01531598] [-0.02478953 0.01823584]]</Weights2> 
</Test> 

Trọng số là giá trị tôi muốn lưu trữ. Bây giờ vấn đề là phương thức fromstring() của numpy không thể tải lại những thứ này ... Tôi nhận được "ValueError: kích thước chuỗi phải là bội số của kích thước phần tử"

Tôi đã viết chúng với "np.array_str (w1) "và cố gắng đọc chúng với" np.fromstring (w_str1) ". Rõ ràng kết quả chỉ là mảng 1D ngay cả khi nó hoạt động, vì vậy tôi phải khôi phục lại hình dạng theo cách thủ công. Ugh, đó là một nỗi đau vì tôi cũng sẽ phải cất giữ nó bằng cách nào đó.

Cách tốt nhất để làm điều này đúng cách là gì? Tốt nhất là một trong đó cũng tiết kiệm hình dạng mảng và datatype của tôi mà không cần vệ sinh bằng tay cho mọi điều nhỏ.

Trả lời

11

NumPy cung cấp một cách dễ dàng để lưu trữ nhiều mảng trong một tập tin nén:

a = np.arange(10) 
b = np.arange(10) 
np.savez_compressed('file.npz', a=a, b=b) 

Bạn thậm chí có thể thay đổi tên mảng khi tiết kiệm, bằng cách làm ví dụ: np.savez_compressed('file.npz', newa=a, newb=b).

Để đọc sử dụng tập tin lưu np.load(), mà trả về một trường hợp NpzFile rằng hoạt động giống như một cuốn từ điển:

loaded = np.load('file.npz') 

Để tải các mảng:

a_loaded = loaded['a'] 
b_loaded = loaded['b'] 

hay:

from operator import itemgetter 
g = itemgetter('a', 'b') 
a_loaded, b_loaded = g(np.load('file.npz')) 
+0

Cảm ơn nó không chính xác những gì tôi nghĩ đến (điều này vẫn tạo ra hàng tấn tệp bên ngoài), nhưng giải pháp này cực kỳ đơn giản ít nhất. Tôi có thể liên kết các tệp npz với dữ liệu XML của mình bằng cách sử dụng ngày tháng làm tên tệp. – user2323596

+2

Ít nhất ở đây bạn có thể lưu trữ nhiều mảng chỉ trong một tệp và quyền truy cập có thể được thực hiện sau bằng cách sử dụng các phím từ điển làm ngày, ví dụ: 'np.savez_compressed ('all.npz', d2013_12_29 = a, d2013_12_30 = b , d2013_12_31 = c) ', bạn có thể bao gồm nhiều ngày như bạn muốn ở đây ... –

3

Thật không may là không có cách nào dễ dàng để đọc đầu ra hiện tại của bạn vào numpy. Sản lượng sẽ không nhìn như thoải mái trong hồ sơ xml của bạn, nhưng bạn có thể tạo ra một phiên bản có thể đọc được các mảng của bạn như sau:

>>> import cStringIO 
>>> a = np.array([[ 0.99845902, -0.70780512, 0.26981375, -0.6077122, 0.09639695], [ 0.61856711, -0.74684913, 0.20099992, 0.99725171, -0.41826754], [ 0.79964397, 0.56620812, -0.64055346, -0.50572793, -0.50100635]]) 
>>> out_f = cStringIO.StringIO() 
>>> np.savetxt(out_f, a, delimiter=',') 
>>> out_f.getvalue() 
'9.984590199999999749e-01,-7.078051199999999543e-01,2.698137500000000188e-01,-6.077122000000000357e-01,9.639694999999999514e-02\n6.185671099999999756e-01,-7.468491299999999722e-01,2.009999199999999986e-01,9.972517100000000134e-01,-4.182675399999999932e-01\n7.996439699999999817e-01,5.662081199999999814e-01,-6.405534600000000189e-01,-5.057279300000000477e-01,-5.010063500000000447e-01\n' 

Và load nó trở lại như:

>>> in_f = cStringIO.StringIO(out_f.getvalue()) 
>>> np.loadtxt(in_f, delimiter=',') 
array([[ 0.99845902, -0.70780512, 0.26981375, -0.6077122 , 0.09639695], 
     [ 0.61856711, -0.74684913, 0.20099992, 0.99725171, -0.41826754], 
     [ 0.79964397, 0.56620812, -0.64055346, -0.50572793, -0.50100635]]) 
1

Đề nghị của tôi nếu bạn thực sự muốn giữ nguyên định dạng XML ban đầu mà bạn có, là sử dụng mô-đun json để chuyển đổi giữa ndarraystring.

Kiểm tra như sau:

import json, numpy 

w1 = numpy.array([[ 0.99845902, -0.70780512, 0.26981375, -0.6077122, 0.09639695], 
        [ 0.61856711, -0.74684913, 0.20099992, 0.99725171, -0.41826754], 
        [ 0.79964397, 0.56620812, -0.64055346, -0.50572793, -0.50100635]]) 

print w1 
print 

##### 

w1string = json.dumps(w1.tolist()) 

## NOW YOU COULD PASS "w1string" TO/FROM XML 

##### 


print w1string 
print 

w1back = numpy.array(json.loads(w1string)) 

print w1back 
print 
0

Bạn có thể sử dụng để chuyển đổi numpy.ndarray.tostring() mảng thành chuỗi (byte mảng trên thực tế). Numpy.ndarray.tostring()

Sau đó, điều này có thể được sử dụng để đọc lại mảng bằng cách sử dụng numpy.fromstring().

In [138]: x = np.arange(12).reshape(3,4) 

In [139]: x.tostring() 
Out[139]: '\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\t\x00\x00\x00\n\x00\x00\x00\x0b\x00\x00\x00' 

In [140]: np.fromstring(x.tostring(), dtype=x.dtype).reshape(x.shape) 
Out[140]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 
+0

Lưu ý rằng .tostring() .. np.fromstring() mất hình dạng của mảng; nó đọc trở lại như một hàng đơn - do đó sử dụng .reshape() trong ví dụ. Bạn phải truyền đạt hình dạng theo một cách khác. – dpwe

Các vấn đề liên quan