在全局命名空间中加载Numpy npz文件的内容

时间:2017-01-31 15:16:25

标签: python numpy

Numpy允许在一个npz文件中导出几个数组,然后可以加载,例如:

infile = "somefile.npz"
inData = np.load( infile)
print( inData.files) #will list all the arrays importable from the file

我对可以在一次调用中导出之前加载所有数据并保存命名的函数感兴趣。

我可以通过以下方式“内联”:

infile = "somefile.npz"
inData = np.load( infile)
for varName in inData.files:
    exec(varName + " = inData[\"" + varName + "\"]")

似乎有用。但是,由于我想在多个地方使用它,所以当移动到函数中时它似乎不起作用:

def importEverything( infile):
    #imports everything inside the npz input file and keeps the variable in the global namespace

似乎变量的范围不能从该函数的局部范围扩展。

似乎我在这里误解了一些关于Python的东西。有可能吗?这是不可取的吗?

2 个答案:

答案 0 :(得分:1)

这实际上不是变量范围的问题。实际上你的第二个代码块不起作用。如果您打印出正在执行的命令,则会得到:

arr_0 = inData[arr_0]

这就是您收到错误NameError: name 'arr_0' is not defined的原因,因为arr_0未定义,但您尝试使用inData索引arr_0。你想要做的事实是:

arr_0 = inData['arr_0']

要解决此问题,只需在第二个varName周围添加单引号,使其成为字符串而不是变量名。试试这个:

infile = "somefile.npz"
inData = np.load( infile)
for varName in inData.files:
    exec(varName + " = inData['" + varName + "']")

一切正常。现在您可以定义您的功能:

def importEverything(infile):
    for varName in inData.files:
        exec(varName + " = inData['" + varName + "']")

输入:

import numpy as np


x = np.array([1,2,3])
y = np.array([[1,2], [3,4]])
np.savez('somefile', x, y)

importEverything('somefile.npz')
print(arr_0)
print(arr_1)

输出:

[1 2 3]
[[1 2]
 [3 4]]

答案 1 :(得分:1)

以下应该可以使用SessionsController功能。在docs中,它声明范围是定义模块而不是调用。因此,需要在调用它的同一模块中定义函数。

globals

如果你想把你的功能放在一个模块中,试试这个:

import numpy as np

def import_npz(npz_file):
    Data = np.load(npz_file)
    for varName in Data:
        globals()[varName] = Data[varName]

import_npz('test.npz')

import_test.py

from import_test import import_npz
import_npz('test.npz', globals())