IPython:如何自动加载 npz 文件并将值分配给变量?

5

我是一名新手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))之类的结果。


请参见:https://dev59.com/fmcs5IYBdhLWcg3w433H - Raj Ranjhan
2个回答

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

在Ipython会话中,locals()是一个大字典,包含你定义的变量、输入历史记录行和各种输出。 update会将npzfile的字典值添加到此字典中。
顺便说一下,您还可以加载和保存MATLAB .mat文件。 使用scipy.io.loadmatsavemat。 它处理v4(Level 1.0),v6和v7到7.2文件。 但是您有相同的问题-结果是一个字典。
Octave具有load命令的表达式形式,该命令将数据加载到结构中
S = load("file", "options", "v1", "v2", ...)
通常numpyipython没有与MATLAB相同类型的“保存工作区快照”的概念。 我主要编写脚本来生成(和加载)必要的数据,并将它们作为独立的python会话运行或从其中运行它们。 ipython确实具有出色的历史记录功能。 您可能还会发现ipython笔记本工具有用。 我没有使用过那个。
在函数内部,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)”可以将变量放入工作区。我尝试将这两个部分组合成一个新函数,只需通过传递文件名作为参数调用该函数即可将变量转储到工作区。然而,这似乎不起作用。我错过了什么吗?感谢您的所有帮助。 - user2734434

2

我一遍又一遍地寻找同样的东西,每次都要加载数十个数组,感到疲倦。

以上内容与IT技术有关。

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

由于我经常在校园集群上运行计算并在我的笔记本电脑上后处理结果(numpy数组),因此我非常欣赏免费的Spyder IDE(顺便说一下,它可以交互式地运行IPython控制台),它具有类似Matlab GUI的变量浏览器,可以通过单击鼠标加载整个npz存档(或选择性变量,如果您愿意)或spydata存档。它大大加快了我使用numpy数组的工作流程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接