使用h5py加载变量时执行基本的数学运算

时间:2016-06-03 14:46:10

标签: python parsing h5py

我正在对hdf5文件中包含的大量变量进行数据分析。我编写的代码循环遍历变量列表,然后执行分析并输出一些图形。能够将代码用于变量组合(例如A+Bsqrt((A**2)+(B**2))而不必放入一堆if语句,即在加载时在字符串中执行语句,这将是很好的。来自我的hdf5文件的变量。如果可能的话,我想避免使用pandas,但我并不完全反对它,如果这是我想要的唯一有效方式。

我的hdf5文件看起来像这样:

HDF5 "blahblah.hdf5" {
FILE_CONTENTS {
 group      /
 group      /all
 dataset    /all/blargle
 dataset    /all/blar
 }
}

我想做的是这个(h5py中不存在此功能,所以它有错误):

myfile  = h5py.File('/myfile/blahblah.hdf5')
varlist = ['blargle', 'blar', 'blargle+blar'] 

savelist = [None]*len(varlist)

for ido, varname in enumerate(varlist):
    savelist[ido] = myfile['all'][varname] 
    #would like to evaluate varname upon loading

1 个答案:

答案 0 :(得分:0)

首先你必须问自己:我是否只在运行时或编程时才知道算术运算?

如果你现在已经知道了,只需用Python编写一个函数。

如果只在运行时知道它,则需要一个解析器。虽然有专门针对此的库(example),但Python本身已经是一个解析器。使用exec,您可以执行包含Python代码的字符串。

现在你需要定义的是特定语言的某种语法。你需要一些约定。您已经拥有它们,似乎您希望将myfile['all']['blargle+blar']转换为myfile['all']['blargle']+myfile['all']['blar']。为了让生活更轻松,我建议。

将数据集的名称放在括号中。

varlist = ['[blargle]', '[blar]', '[blargle]+[blar]', 'sqrt(([blargle]**2)+([blar]**2)'] 

然后只需用myfile['all'][name_in_brackets]替换括号中的所有字词,然后使用exec执行字符串。

import re
for ido, varname in enumerate(varlist):
    term = re.sub(r'\[(.*?)\]', lambda x: "myfile['all']['{}']".format(x), varname, flag='g')
    savelist[ido] = exec(term)

使用正则表达式匹配变量名re.sub的行实际上没有经过我测试。

还有一个缺点。我不确定从hdf5对象读取数据集是否很快,因为可以多次读取相同的数据集,如果hdf5没有缓存,那么在对它们进行计算之前中间存储数据集可能会更好。