IPython: 如何自动加载npz文件并为变量赋值?

IPython: how to automagically load npz file and assign values to variables?

我是 Python 的新手,我急切地从 MATLAB 迁移到 IPython 作为我在实验室进行数据分析的首选语言。

在 MATLAB 中,经过一段数据处理后,我会做

>>> save('myresults.mat','x','y','z');

并将变量 x、y 和 z 的结果保存在名为 'myresults.mat' 的文件中。稍后,我可以简单地说:

>>> load('myresults');

并且 MATLAB 将加载 .mat 文件并将变量的存储值分配给当前工作区。

我最近了解到我可以使用 numpy 为 IPython 做类似的事情,即:

import numpy as np
a = 2
b = np.sqrt(2)
np.savez('myresultsinpython',a,b)

然后再做类似

的事情
npzfile = np.load('myresultsinpython')

但是,我得到的是一个对象,我可以通过以下方式访问我的变量:

npzfile['arr_1']

等,但我丢失了有关变量原始名称的所有信息。我知道我可以通过

来保存文件
np.savez('myresultsinpython',a=a,b=b)

但这不是很有用,因为我仍然需要做类似的事情:

npzfile['a']

访问变量的值。

如何加载文件并在我的工作区中创建变量并根据文件中存储的值分配它们的值?

类似于 np.load('myresults') 并且能够做到 a+b 并在 return 中获得 3.4142135623730949 (=2+sqrt(2))

locals().update(npzfile)
a   # and/or b

在 Ipython 会话中,locals() 是一个大字典,其中包含您定义的变量、输入历史行和各种输出。 updatenpzfile 的字典值添加到那个较大的字典值。

顺便说一下,您还可以加载和保存 MATLAB .mat 文件。使用 scipy.io.loadmatsavemat。它处理 v4 (Level 1.0), v6 and v7 to 7.2 个文件。但是你有同样的问题 - 结果是一本字典。

Octave有一种加载命令的表达形式,将数据加载到一个结构体中

S = 负载 ("file", "options", "v1", "v2", ...)

一般来说,numpyipython 没有与 MATLAB 相同的 'save a snapshot of the workspace' 想法。我主要编写脚本来生成(和加载)必要的数据,并且 运行 它们作为独立的 python 会话或 运行 它们来自 ipython。 ipython 确实有一个很好的历史功能。您可能还会发现 ipython 笔记本工具很有用。我没用过。


函数内部,locals()与函数外部不同。对每个函数都是'local'。有一个 globals() 字典可能允许在函数外设置变量。但是不鼓励这种编程风格。

Anurag 引用的 SO 问题指向一个 save_ipython_variables 包。 https://pypi.python.org/pypi/save_ipython_variables/0.0.3 它使用 pickle 保存变量,并通过

之类的方式加载它们
exec '__builtins__[name] = pickle.load(...)

使用 exec__builtins__ 它正在推动一些安全的编程边界。所以谨慎使用。但是一个小测试在我的环境中确实有效。同样的技术可能适用于 npz 个文件。

我一次又一次地寻找同样的东西,厌倦了每次都要加载几十个数组:

data = np.load("file.npz")
var1 = data["my_var1"]
...

由于我定期在校园集群上运行 进行计算,并在我的笔记本电脑上post 处理结果(numpy 数组),我非常感谢免费的 Spyder IDE(它顺便说一句 运行s 一个 IPython 交互式控制台),它有一个类似 Matlab GUI 的变量浏览器,可以让你加载整个 npz-archive(或者如果你愿意的话可以选择变量)或者用鼠标加载 spydata archive点击。它大大加快了我使用 numpy 数组的工作流程。