IPython: ¿cómo cargar automáticamente el archivo npz y asignar valores a las variables?

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.