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

2024-10-01 13:28:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

在MATLAB中,经过一段时间的数据处理,我会

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

并将变量x、y和z的结果保存在一个名为'我的结果.mat'. 后来,我可以简单地说:

^{pr2}$

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并得到{}作为回报。在


Tags: 文件numpy语言ipythonnpload事情实验室
2条回答
locals().update(npzfile)
a   # and/or b

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

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

Octave具有load命令的表达式形式,用于将数据加载到结构中

S=加载(“文件”,“选项”,“v1”,“v2”,…)

一般来说,numpy和{}并不像MATLAB那样有“保存工作区快照”的想法。或者在python中单独运行脚本,或者在需要的情况下从python中加载并运行脚本。ipython有一个很好的历史特性。您可能还发现ipython笔记本工具很有用。我没用过。在


在一个函数中,locals()与它外部不同。它对每个函数都是“局部”的。有一个globals()字典,它可能允许在函数之外设置变量。但这种编程风格并不受鼓励。在

Anurag引用的SO问题指向一个save_ipython_variables包。https://pypi.python.org/pypi/save_ipython_variables/0.0.3它用pickle保存变量,并通过执行如下操作加载它们

^{pr2}$

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

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

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

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

相关问题 更多 >