Soy nuevo en Python y estoy migrando ansiosamente de MATLAB a IPython como mi idioma preferido para el análisis de datos en el laboratorio.
En MATLAB, después de una sesión de procesamiento de datos, lo haría
>>> save('myresults.mat','x','y','z');
y guarde los resultados de las variables x, y, z en un archivo llamado ‘myresults.mat’. Más tarde, simplemente podría decir:
>>> load('myresults');
y MATLAB cargaría el archivo .mat Y asignaría los valores almacenados de las variables al espacio de trabajo actual.
Recientemente aprendí que puedo hacer lo mismo para IPython usando numpy, a saber:
import numpy as np a = 2 b = np.sqrt(2) np.savez('myresultsinpython',a,b)
y luego hacer algo como
npzfile = np.load('myresultsinpython')
Sin embargo, lo que obtengo es un objeto desde el cual puedo acceder a mis variables al:
npzfile['arr_1']
etc., pero pierdo toda la información sobre los nombres originales de las variables. Sé que podría guardar el archivo haciendo
np.savez('myresultsinpython',a=a,b=b)
pero esto no es tan útil, ya que todavía tengo que hacer algo como:
npzfile['a']
para acceder al valor de la variable.
¿Cómo puedo cargar el archivo y tener las variables creadas en mi área de trabajo y sus valores asignados de acuerdo con los valores almacenados en el archivo?
Algo como np.load('myresults')
y poder hacer a+b
y obtener 3.4142135623730949 (=2+sqrt(2))
a cambio.
locals().update(npzfile) a # and/or b
En la sesión de Ipython, locals()
es un gran diccionario con las variables que ha definido, las líneas del historial de entrada y varias salidas. update
agrega los valores del diccionario de npzfile
a ese más grande.
Por cierto, también puede cargar y guardar archivos .mat de MATLAB. Utilice scipy.io.loadmat
y savemat
. Maneja archivos v4 (Level 1.0), v6 and v7 to 7.2
. Pero tienes el mismo problema: el resultado es un diccionario.
Octave tiene una forma de expresión del comando de carga, que carga los datos en una estructura
S = cargar (“archivo”, “opciones”, “v1”, “v2”, …)
En general, numpy
e ipython
no tienen el mismo tipo de idea de ‘guardar una instantánea del área de trabajo’ que MATLAB. Principalmente escribo scripts para generar (y cargar) los datos necesarios, y los ejecuto como sesiones de Python independientes o como ejecutándolos desde ipython. ipython tiene una buena característica de historia. También puede encontrar útil la herramienta ipython notebook. No he usado eso.
Dentro de una función, locals()
es diferente de fuera de ella. Es ‘local’ para cada función. Hay un diccionario globals()
que podría permitir establecer variables fuera de la función. Pero este estilo de progtwigción no es alentador.
La pregunta de SO que Anurag
citó apunta a un paquete save_ipython_variables
. https://pypi.python.org/pypi/save_ipython_variables/0.0.3 Guarda las variables con pickle
, y las carga haciendo algo como
exec '__builtins__[name] = pickle.load(...)
Con el uso de exec
y __builtins__
está empujando algunos límites de progtwigción seguros. Así que use con precaución. Pero una pequeña prueba funciona en mi entorno. La misma técnica podría funcionar con archivos npz
.
Estaba buscando lo mismo una y otra vez, cansándome de tener que cargar docenas de arreglos cada vez en el camino:
data = np.load("file.npz") var1 = data["my_var1"] ...
Ya que dejo que los cálculos se ejecuten regularmente en el clúster del campus y postprocesé los resultados (numerosos arreglos) en mi computadora portátil, realmente aprecio el Spyder IDE gratuito (que por cierto ejecuta una consola IPython interactivamente), que tiene un explorador de variables similar a la GUI de Matlab que le permite cargar un archivo npz completo (o variables selectivas si lo desea) o un archivo spydata con un clic del ratón. Se acelera enormemente mi flujo de trabajo con matrices numpy.