使用 h5py 解包数据

Unpacking data with h5py

我想将 numpy 数组写入文件并轻松地再次加载它们。

我想要一个函数 save(),最好按以下方式工作:

data = [a, b, c, d]
save('data.h5', data)

然后执行以下操作

h5f = h5py.File('data.h5', 'w')
h5f.create_dataset('a', data=a)
h5f.create_dataset('b', data=b)
h5f.create_dataset('c', data=c)
h5f.create_dataset('d', data=d)
h5f.close()

然后我想轻松加载此数据,例如

a, b, c, d = load('data.h5')

执行以下操作:

h5f = h5py.File('data.h5', 'r')
a = h5f['a'][:]
b = h5f['b'][:]
c = h5f['c'][:]
d = h5f['d'][:]
h5f.close()

我可以想到以下方法来保存数据:

h5f = h5py.File('data.h5', 'w')
data_str = ['a', 'b', 'c', 'd']
for name in data_str:
    h5f.create_dataset(name, data=eval(name))
h5f.close()

我想不出使用 data_str 然后再次加载数据的类似方法。

重新阅读问题(是否经过编辑?),我看到 load 应该用作:

a, b, c, d = load('data.h5')

这消除了我之前担心的全局变量名问题。只是 return 4 个数组(作为一个元组),调用表达式负责分配名称。当然这样一来,全局变量名就不必与文件中的名称匹配,也不必与函数内部使用的名称匹配。

def load(filename):
    h5f = h5py.File(filename, 'r')
    a = h5f['a'][:]
    b = h5f['b'][:]
    c = h5f['c'][:]
    d = h5f['d'][:]
    h5f.close()
    return a,b,c,d

或使用 data_str 参数:

def load(filename, data_str=['a','b','c','d']):
    h5f = h5py.File(filename, 'r')
    arrays = []
    for name in data_str:
        var = h5f[name][:]
        arrays.append(var)
    h5f.close()
    return arrays

加载文件中的所有变量,参见


一个较早的答案假定您想要从文件键名中获取变量名。

这不是 h5py 问题。它是关于使用字典(或其他结构)中的名称创建全局(或局部)变量。换句话说,如何创建一个变量,使用字符串作为名称。

此问题经常与命令行解析器 argparse 有关。它给出了一个像 args=namespace(a=1, b='value') 这样的对象。很容易把它变成字典(vars(args)),{'a':1, 'b':'value'}。但是你必须做一些棘手的事情,而不是 Pythonic,来创建 ab 变量。

如果您在函数内部创建该字典,然后想要创建全局变量(即在函数外部),情况会更糟。

技巧涉及分配给 locals()globals()。但由于它不是 pythonic,所以我不愿意更具体。

用这么多的话来说,我说的和

中接受的答案是一样的

要将文件中的变量加载到 Ipython 环境中,请参阅

ipython-loading-variables-to-workspace

我会用 deepdish (deepdish.io):

import deepdish as dd
dd.io.save(filename, {'dict1': dict1, 'obj2': obj2}, compression=('blosc', 9))