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

use*_*434 5 python load numpy save ipython

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

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

>>> save('myresults.mat','x','y','z');
Run Code Online (Sandbox Code Playgroud)

并将变量 x、y 和 z 的结果保存在名为“myresults.mat”的文件中。后来我只能简单地说:

>>> load('myresults');
Run Code Online (Sandbox Code Playgroud)

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

我最近了解到我可以使用 numpy 对 IPython 执行类似的操作,即:

import numpy as np
a = 2
b = np.sqrt(2)
np.savez('myresultsinpython',a,b)
Run Code Online (Sandbox Code Playgroud)

然后做类似的事情

npzfile = np.load('myresultsinpython')
Run Code Online (Sandbox Code Playgroud)

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

npzfile['arr_1']
Run Code Online (Sandbox Code Playgroud)

等等,但我丢失了有关变量原始名称的所有信息。我知道我可以通过以下方式保存文件

np.savez('myresultsinpython',a=a,b=b)
Run Code Online (Sandbox Code Playgroud)

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

npzfile['a']
Run Code Online (Sandbox Code Playgroud)

访问变量的值。

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

诸如np.load('myresults')能够做a+b并获得3.4142135623730949 (=2+sqrt(2))回报的事情。

hpa*_*ulj 3

locals().update(npzfile)
a   # and/or b
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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


函数内部locals()与外部不同。它对于每个函数来说都是“本地的”。有一个globals()字典可能允许在函数外部设置变量。但这种编程风格并不被鼓励。

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

exec '__builtins__[name] = pickle.load(...)
Run Code Online (Sandbox Code Playgroud)

exec随着和的使用__builtins__,它正在突破一些安全编程的界限。所以要谨慎使用。但一个小测试在我的环境中确实有效。同样的技术也适用于npz文件。