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



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的一些东西。可以做到吗?这是不可取的吗?

以下内容应通过使用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')

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

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

import_test.py

import numpy as np
def import_npz(npz_file, namespace):
    Data = np.load(npz_file)
    for varName in Data:
        namespace[varName] = Data[varName]

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

arr_0 = inData[arr_0]

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

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]]

最新更新