web-dev-qa-db-fra.com

Python: enregistrez les dictionnaires via numpy.save

J'ai un grand ensemble de données (millions de lignes) en mémoire, sous la forme de tableaux numpy et dictionnaires.

Une fois ces données construites, je veux les stocker dans des fichiers; ainsi, plus tard, je peux charger ces fichiers en mémoire rapidement, sans reconstruire ces données à partir de zéro.

np.save et np.load les fonctions font le travail en douceur pour les tableaux numpy.
Mais j'ai des problèmes avec les objets dict.

Voir l'exemple ci-dessous. d2 est le dictionnaire qui a été chargé à partir du fichier. Voir #out [28] il a été chargé dans d2 en tant que tableau numpy, pas en tant que dict. Ainsi, les autres opérations de dict telles que get ne fonctionnent pas.

Existe-t-il un moyen de charger les données du fichier en tant que dict (au lieu d'un tableau numpy)?

In [25]: d1={'key1':[5,10], 'key2':[50,100]}

In [26]: np.save("d1.npy", d1)

In [27]: d2=np.load("d1.npy")

In [28]: d2
Out[28]: array({'key2': [50, 100], 'key1': [5, 10]}, dtype=object)

In [30]: d1.get('key1')  #original dict before saving into file
Out[30]: [5, 10]

In [31]: d2.get('key2')  #dictionary loaded from the file
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-31-23e02e45bf22> in <module>()
----> 1 d2.get('key2')

AttributeError: 'numpy.ndarray' object has no attribute 'get'
21
ramu

C'est un tableau structuré. Utilisez d2.item() pour récupérer d'abord l'objet dict réel:

import numpy as np

d1={'key1':[5,10], 'key2':[50,100]}
np.save("d1.npy", d1)
d2=np.load("d1.npy")
print d1.get('key1')
print d2.item().get('key2')

résultat:

[5, 10]
[50, 100]
48
Kennet Celeste

pickle module peut être utilisé. Exemple de code:

from six.moves import cPickle as pickle #for performance
from __future__ import print_function
import numpy as np

def save_dict(di_, filename_):
    with open(filename_, 'wb') as f:
        pickle.dump(di_, f)

def load_dict(filename_):
    with open(filename_, 'rb') as f:
        ret_di = pickle.load(f)
    return ret_di

if __name__ == '__main__':
    g_data = {
        'm':np.random.Rand(4,4),
        'n':np.random.Rand(2,2,2)
    }
    save_dict(g_data, './data.pkl')
    g_data2 = load_dict('./data.pkl')
    print(g_data['m'] == g_data2['m'])
    print(g_data['n'] == g_data2['n'])

Vous pouvez également enregistrer plusieurs objets python dans un seul fichier mariné. Chaque pickle.load l'appel chargera un seul objet dans ce cas.

4
Kh40tiK