functions - numpy python tutorial
Python: guardar diccionarios a través de numpy.save (2)
Esta pregunta ya tiene una respuesta aquí:
Tengo un gran conjunto de datos (millones de filas) en la memoria, en forma de arrays y diccionarios numpy .
Una vez que se construyen estos datos, quiero almacenarlos en archivos; Entonces, más tarde, puedo cargar estos archivos en la memoria rápidamente, sin volver a reconstruir estos datos desde cero.
Las funciones np.save y np.load hacen el trabajo sin problemas para las matrices numpy.
Pero estoy enfrentando problemas con los objetos dict.
Vea abajo la muestra. d2 es el diccionario que se cargó desde el archivo. Vea #out [28] que se ha cargado en d2 como una matriz numpy, no como un dict. Así que otras operaciones de dictado como get no funcionan.
¿Hay alguna forma de cargar los datos del archivo como dict (en lugar de una matriz 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''
Es una matriz estructurada. Use d2.item()
para recuperar primero el objeto dict real:
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'')
resultado:
[5, 10]
[50, 100]
Se puede utilizar el módulo pickle . Código de ejemplo:
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''])
También puede guardar varios objetos de Python en un único archivo encurtido. Cada llamada pickle.load
cargará un solo objeto en ese caso.