【问题标题】:Unpacking data with h5py使用 h5py 解包数据
【发布时间】:2015-05-01 15:47:19
【问题描述】:

我想将 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 然后再次加载数据。

【问题讨论】:

标签: python numpy h5py


【解决方案1】:

重读问题(是否已编辑?),我看到load 应该起到以下作用:

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

这消除了我之前担心的全局变量名称问题。只需返回 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

要加载文件中的所有变量,请参阅Reading ALL variables in a .mat file with python h5py


假设您想从文件键名中获取变量名的较早答案。

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

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

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

诀窍涉及分配给locals()globals()。但由于它不是 Pythonic,我不愿意更具体。

在很多话中,我所说的与https://stackoverflow.com/a/4467517/901925中公认的答案相同


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

https://stackoverflow.com/a/28258184/901925ipython-loading-variables-to-workspace

【讨论】:

  • 我一直在寻找一个可以加载任意数量变量的函数,但在您的第二部分中,您解释说这不会很 Pythonic。感谢您提供所有信息!
【解决方案2】:

我会使用 deepdish (deepdish.io):

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

【讨论】:

    猜你喜欢
    • 2015-10-29
    • 2017-02-25
    • 1970-01-01
    • 2016-04-04
    • 2016-02-27
    • 1970-01-01
    • 2013-04-19
    • 2017-06-12
    相关资源
    最近更新 更多