在 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()
我正在尝试将使用 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()