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

2023-12-04

我正在从 MATLAB 迁移到 ipython,在迈出这一步之前,我将完成我的最小工作流程,以确保我每天在 MATLAB 上执行的用于数据处理的每项操作都可以在 ipython 上使用。

我目前陷入了通过单行命令(例如 MATLAB 的命令)保存和加载 numpy 数组这一非常基本的任务:

>>> save('myresults.mat','a','b','c')
>>> load('myresults.mat')

特别是,我喜欢 MATLAB 的 load 命令的一点是它不仅可以读取 数据文件,但它将变量加载到工作区中,不需要其他任何东西就可以开始使用它们。请注意,例如 numpy.load() 就不是这种情况,它需要另一行才能将加载的值分配给工作区变量。 [ 看:IPython:如何自动加载 npz 文件并为变量赋值? ]

根据该问题的答案和评论,我想出了这个肮脏、糟糕、工程丑陋、编码但有效的解决方案。我知道这并不漂亮,我想知道您是否能提出这个 [1] 的正确版本。

我将其放入 iocustom.py 中:

def load(filename):
    ip = get_ipython()
    ip.ex("import numpy as np")
    ip.ex("locals().update(np.load('" + filename + "'))") 

这样我就可以从 ipython 会话运行:

import iocustom
load('myresults.npz')

并且变量被转储到工作区。

我很难相信没有任何内置函数可以与此等效,更难认为该 3 行函数是最佳解决方案。如果您能建议一种更正确的方法,我将非常感激。

请记住:

  • 我正在寻找一种也可以在脚本和函数内部工作的解决方案。
  • 我知道有“pickle”,但我拒绝使用多于一行的代码来执行简单的“保存”和/或“加载”命令等平凡的事情。
  • 我知道 scipy 提供了“savemat”和“loadmat”,但我想完全迁移,即不使用 mat 文件,而是使用 numpy 数组。

预先感谢您的所有帮助。

[1] 顺便说一句:使用 ipython 的人如何轻松保存和加载一组 numpy 数组?经过几个小时的谷歌搜索后,我似乎无法找到一个简单直接的解决方案来完成这项日常任务。


如果我将其另存为load_on_run.py:

import argparse
import numpy as np
if __name__=='__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-l','--list', help='list variables', action='store_true')
    parser.add_argument('filename')
    __args = parser.parse_args()
    data = np.load(__args.filename)
    locals().update(data)
    del parser, data, argparse, np
    if __args.list:
        print([k for k in locals() if not k.startswith('__')])
    del __args

然后在ipython我可以调用它%run:

In [384]: %run load_on_run testarrays.npz -l
['array2', 'array3', 'array4', 'array1']
In [385]: array3
Out[385]: array([-10,  -9,  -8,  -7,  -6,  -5,  -4,  -3,  -2,  -1])

它巧妙地将数组从文件加载到ipython工作区。

我正在利用魔法这一事实%run运行脚本,将其定义的所有函数和变量保留在主命名空间中。我还没有研究过它是如何做到这一点的。

该脚本只需要几个参数,加载文件(到目前为止仅.npz),并使用locals().update将其变量放入本地命名空间的技巧。然后我清除了不必要的变量和模块,只留下新加载的变量和模块。

我可能可以定义一个别名%run load_on_run.

我还可以想象一个这样的脚本,它可以让您通过导入来加载变量:from <script> import *.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐