2013-07-10 6 views
7

मेरे प्रोग्राम में मैं विभिन्न आकारों के विभिन्न numpy arrays के साथ काम कर रहा हूं। मुझे बाद में उपयोग के लिए उन्हें एक्सएमएल फाइलों में स्टोर करने की जरूरत है। मैंने उन्हें बाइनरी फाइलों में नहीं लिखा था, इसलिए मेरे पास एक ही स्थान (एक्सएमएल फाइल) में मेरा पूरा डेटा है और 200 फाइलों के माध्यम से बिखरा हुआ नहीं है।फ़ाइलों के रूप में numpy arrays को संग्रहीत और लोड करना

तो मैंने एक सरणी को स्ट्रिंग में बदलने के लिए numpy की array_str() विधि का उपयोग करने का प्रयास किया। जिसके परिणामस्वरूप एक्सएमएल इस तरह दिखता है:

-<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> 

बाट मूल्यों मैं संग्रहीत करना चाहते हैं। अब समस्या यह है कि numpy की fromstring() विधि इन्हें पुनः लोड नहीं कर सकती है ... मुझे "ValueError: स्ट्रिंग आकार तत्व आकार का एक बहु होना चाहिए"

मैंने उन्हें "np.array_str (w1) "और उन्हें" np.fromstring (w_str1) "के साथ पढ़ने का प्रयास करें। स्पष्ट रूप से परिणाम केवल 1 डी सरणी है, भले ही यह काम करता है, इसलिए मुझे मैन्युअल रूप से आकार को पुनर्स्थापित करना होगा। उह, यह पहले से ही दर्द है क्योंकि मुझे इसे किसी भी तरह से स्टोर करना होगा।

इसे ठीक से करने का सबसे अच्छा तरीका क्या है? पसंदीदा रूप से वह जो हर छोटी चीज़ के लिए मैन्युअल हाउसकीपिंग के बिना मेरी सरणी के आकार और डेटाटाइप को भी बचाता है। np.savez_compressed('file.npz', newa=a, newb=b):

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

तुम भी सरणी के नाम, जब बचत उदाहरण के लिए करने से बदल सकते हैं:

उत्तर

11

Numpy एक आसान तरीका एक संपीड़ित फ़ाइल में कई सरणियों स्टोर करने के लिए प्रदान करता है।

सहेजी गई फ़ाइल उपयोग np.load() है, जो एक NpzFile उदाहरण है कि एक शब्दकोश की तरह काम करता रिटर्न पढ़ने के लिए:

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

या:

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

धन्यवाद यह बिल्कुल ठीक नहीं है जो मुझे दिमाग में था (यह अभी भी बाहरी फाइलों का निर्माण करता है), लेकिन यह समाधान कम से कम सरल है। मैं फाइल नामों के रूप में तारीखों का उपयोग करके एनपीजेड फ़ाइलों को अपने एक्सएमएल डेटा में जोड़ सकता हूं। – user2323596

+2

कम से कम यहां आप केवल एक फ़ाइल में कई एरे स्टोर कर सकते हैं, और बाद में शब्द कुंजी के रूप में शब्द कुंजी का उपयोग करके किया जा सकता है, उदाहरण: 'np.savez_compressed ('all.npz', d2013_12_29 = a, d2013_12_30 = b , d2013_12_31 = c) ', आप यहां जितनी तारीखें चाहते हैं उतनी तिथियां शामिल कर सकते हैं ... –

3

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

सरणियों लोड करने के लिए

दुर्भाग्य से आपके वर्तमान आउटपुट को वापस पढ़ने का कोई आसान तरीका नहीं है numpy में। उत्पादन अपने xml फ़ाइल पर उतना अच्छा नहीं होगा, लेकिन आप इस प्रकार अपने सरणियों की एक पठनीय संस्करण बना सकते हैं:

>>> 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' 

और इसे वापस लोड के रूप में:

>>> 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

मेरे सुझाव अगर आप वास्तव में आपके पास प्रारंभिक एक्सएमएल स्वरूपण को संरक्षित करना चाहते हैं, json मॉड्यूल का उपयोग ndarray और string के बीच कनवर्ट करने के लिए करना है।

चेक निम्नलिखित:

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

आप numpy.ndarray.tostring() का उपयोग स्ट्रिंग में सरणी परिवर्तित करने के लिए (बाइट्स सरणी वास्तव में) कर सकते हैं। Numpy.ndarray.tostring()

फिर इसे 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

ध्यान दें कि .tostring() .. np.fromstring() सरणी के आकार को खो देता है; यह एक पंक्ति के रूप में वापस पढ़ता है - इसलिए उदाहरण में .reshape() का उपयोग। आपको आकार को किसी अन्य तरीके से संवाद करना होगा। – dpwe

संबंधित मुद्दे