在 hdf5 文件中存储 python lmfit 对象

Storing python lmfit object in hdf5 file

我正在尝试将使用 python 的 lmfit 包制作的拟合结果存储在一个 hdf5 文件中,使用 python 的 h5py 包。

目前我发现自己手动重新创建数据对象的结构(即遍历字典中的所有键,获取值并保存它们)。

我觉得必须有更多 efficient/pythonic 方法将此类对象保存在 hdf5 文件中,类似于对象的 pickle 的工作方式。

谁能帮我找到一种方法来有效地将 lmfit.model.ModelFit 或 lmfit.parameter.Parameters 对象中包含的信息存储在 hdf5 文件中?

已编辑以显示当前使用的。

def add_analysis_datagroup_to_file(self, group_name='Analysis'):
    try:
        self.analysis_group= self.f.create_group(group_name)
    except ValueError:
        print 'Datagroup name "%s" already exists in hdf5 file' %group_name
        self.analysis_group = self.f[group_name]

def save_fitted_parameters(self, fit_results=None):
    if fit_results is None:
        fit_results = self.fit_results
    try:
        fit_grp = self.analysis_group.create_group('Fitted Params')
    except:
        fit_grp = self.analysis_group['Fitted Params']
    for parname, par in self.fit_results.params.iteritems():
        try:
            par_group = fit_grp.create_group(parname)
        except:
            par_group = fit_grp[parname]
        par_dict = vars(par)
        for val_name, val in par_dict.iteritems():
            if val_name == '_val':
                val_name = 'value'
            if val_name == 'correl' and val is not None:
                try:
                    correl_group = par_group.create_group(val_name)
                except:
                    correl_group = par_group[val_name]
                for cor_name, cor_val in val.iteritems():
                    correl_group.attrs.create(name=cor_name, data=cor_val)
            else:
                try:
                    par_group.attrs.create(name=val_name, data=val)
                except:
                    pass

这是一个很老的 post,但我也遇到了同样的问题所以希望这个答案能帮助别人... 您可以在 lmfit 的 ModelResult class 中使用内置方法 dumps() 将文件转换为 json 格式,然后可以将其保存为 hdf5 字符串。如果您想在适当的位置存储多个 fit_results,您还可以使用列表理解来存储 json 文件的数组。参数 class 和模型 class 也有转储方法。 要重新加载,请使用 loads()(同样,参数和模型也可以重新加载,因为它们也有加载方法)

    f = h5py.File('fit_result_example.hdf5','w')
    grp = f.create_group('group1')
    dt = h5py.special_dtype(vlen=str) 
    fit_results = np.asarray([fit_results.dumps()], dtype=dt) 
    grp.create_dataset('fit_results', data=fit_results)
    f.close()