2013-07-10 4 views
7

Dans mon programme, je travaille avec divers tableaux numpy de différentes tailles. J'ai besoin de les stocker dans des fichiers XML pour une utilisation ultérieure. Je ne les ai pas écrits dans des fichiers binaires, donc j'ai toutes mes données au même endroit (le fichier XML) et pas dispersées dans 200 fichiers. J'ai donc essayé d'utiliser la méthode array_str() de numpy pour transformer un tableau en String. Le XML résultant ressemble à ceci:Stockage et chargement de tableaux numpy sous forme de fichiers

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

Les poids sont les valeurs que je veux stocker. Maintenant le problème est que la méthode de numpy fromstring() ne peut pas recharger ces apparemment ... Je reçois "ValueError: la taille de la chaîne doit être un multiple de la taille de l'élément"

Je les ai écrits avec "np.array_str (w1) "et essayez de les lire avec" np.fromstring (w_str1) ". Apparemment, le résultat est seulement un tableau 1D même si cela fonctionne, donc je dois restaurer la forme manuellement. Euh, c'est déjà une douleur car je vais aussi devoir le stocker d'une manière ou d'une autre.

Quelle est la meilleure façon de le faire correctement? De préférence, celui qui enregistre également la forme et le type de données de ma matrice sans entretien manuel pour chaque petite chose.

Répondre

11

Numpy fournit un moyen facile de stocker de nombreux tableaux dans un fichier compressé:

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

Vous pouvez même changer le nom du tableau lors de l'enregistrement, en faisant par exemple: np.savez_compressed('file.npz', newa=a, newb=b).

Pour lire l'utilisation du fichier enregistré np.load(), qui renvoie une instance NpzFile qui fonctionne comme un dictionnaire:

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

Pour charger les tableaux:

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

ou:

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

Merci ce n'est pas exactement ce que j'avais à l'esprit (cela crée encore des tonnes de fichiers externes), mais cette solution est extrêmement simple au moins. Je peux associer des fichiers npz à mes données XML en utilisant les dates comme noms de fichiers. – user2323596

+2

Au moins, ici vous pouvez stocker plusieurs tableaux dans un seul fichier, et l'accès peut être fait plus tard en utilisant les clés du dictionnaire comme étant les dates, exemple: 'np.savez_compressed ('all.npz', d2013_12_29 = a, d2013_12_30 = b , d2013_12_31 = c) ', vous pouvez inclure autant de dates que vous voulez ici ... –

3

Malheureusement, il n'y a pas de moyen facile de lire votre sortie actuelle en numpy. La sortie ne sera pas aussi bien sur votre fichier xml, mais vous pouvez créer une version lisible de vos tableaux comme suit:

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

et le charger en arrière comme:

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

Ma suggestion si vous Vraiment vouloir préserver le formatage initial XML que vous aviez, est d'utiliser le module json pour convertir entre ndarray et string.

Vérifiez les points suivants:

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

Vous pouvez utiliser numpy.ndarray.tostring() pour convertir le tableau en chaîne (tableau octets en fait). Numpy.ndarray.tostring()

Ensuite, cela peut être utilisé plus tard pour relire le tableau en utilisant 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

Notez que .tostring() .. np.fromstring() perd la forme du tableau; il se lit comme une seule ligne - d'où l'utilisation de .reshape() dans l'exemple. Vous devez communiquer la forme d'une autre manière. – dpwe

Questions connexes