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

Posted

技术标签:

【中文标题】IPython:如何自动加载 npz 文件并为变量赋值?【英文标题】:IPython: how to automagically load npz file and assign values to variables? 【发布时间】:2015-01-30 02:34:55 【问题描述】:

我是 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 并获得3.4142135623730949 (=2+sqrt(2)) 作为回报。

【问题讨论】:

请看:***.com/questions/12504951/… 【参考方案1】:
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 = 加载(“文件”、“选项”、“v1”、“v2”、...)

一般而言,numpyipython 与 MATLAB 的“保存工作区快照”的想法不同。我主要编写脚本来生成(和加载)必要的数据,并将它们作为独立的 python 会话运行或在 ipython 中运行它们。 ipython 确实有一个很好的历史功能。您可能还会发现 ipython notebook 工具很有用。我没用过。


在函数内部,locals() 与外部不同。它对每个功能都是“本地的”。有一个 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 文件。

【讨论】:

感谢您的帮助,这确实回答了我的问题。因此,在“npzfile=np.load('myresults)”之后执行“locals().update(npzfile)”会给我工作区中的变量。我尝试将这两个部分放在一个新函数中,我可以通过将文件名作为参数传递来简单地调用它,并让函数将变量转储到工作区中。但是,这似乎不起作用。我在这里错过了什么吗?感谢您的所有帮助。【参考方案2】:

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

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

由于我让计算定期在校园集群上运行并在我的笔记本电脑上对结果(numpy 数组)进行后处理,我非常感谢免费的 Spyder IDE(顺便说一句,它以交互方式运行 IPython 控制台),它有一个 Matlab GUI-比如变量资源管理器,它可以让您通过鼠标单击加载整个 npz 存档(或选择性变量,如果您愿意)或 spydata 存档。它使用 numpy 数组大大加快了我的工作流程。

【讨论】:

以上是关于IPython:如何自动加载 npz 文件并为变量赋值?的主要内容,如果未能解决你的问题,请参考以下文章

Python中.npz文件的读取

IPython中模块的自动重新加载[重复]

如何清除ipython中的变量?

如何将文本文件 (.py) 加载/编辑/运行/保存到 IPython 笔记本单元格中?

IPython 将变量加载到工作区:你能想到比这更好的解决方案吗?

IPython学习笔记