使用 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,来创建 a
和 b
变量。
如果您在函数内部创建该字典,然后想要创建全局变量(即在函数外部),情况会更糟。
技巧涉及分配给 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))
我想将 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,来创建 a
和 b
变量。
如果您在函数内部创建该字典,然后想要创建全局变量(即在函数外部),情况会更糟。
技巧涉及分配给 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))