如何将曲线拟合相关定义移至utilities.py并实现全局调用?
我来帮你梳理下怎么把这些曲线拟合的逻辑迁移到独立的utilities.py文件里,同时解决wrapper找不到相关内容的问题,步骤很清晰:
解决方案:迁移曲线拟合逻辑至utilities.py并修复wrapper引用问题
1. 把所有相关逻辑迁移到utilities.py
首先创建utilities.py文件,把拟合函数、参数处理逻辑、wrapper相关定义都放到这里,确保所有依赖都在同一个文件内:
# utilities.py import numpy as np from scipy.optimize import curve_fit # 替换成你实际使用的基础拟合函数 def core_fit_func(x, *params): # 示例:指数拟合,根据你的需求修改 return params[0] * np.exp(-params[1] * x) + params[2] # 通用固定参数包装器(替代你之前的wrapper/wrapperNa...逻辑) def build_fixed_param_wrapper(base_func, fixed_vals, fixed_indices): """ 生成包装函数,固定指定索引的参数 :param base_func: 原始拟合函数 :param fixed_vals: 固定参数的数值列表 :param fixed_indices: 需要固定的参数索引(从0开始) :return: 适配后的拟合函数 """ def wrapped_func(x, *var_params): # 合并可变参数与固定参数,还原完整参数列表 full_params = list(var_params) for idx, val in zip(fixed_indices, fixed_vals): full_params.insert(idx, val) return base_func(x, *full_params) return wrapped_func # 封装你提到的三个拟合场景 def variable_params_curve_fit_0(x_data, y_data, initial_guess): # 场景0:所有参数都可变,直接调用curve_fit popt, pcov = curve_fit(core_fit_func, x_data, y_data, p0=initial_guess) return popt, pcov def variable_params_curve_fit_1(x_data, y_data, initial_guess): # 场景1:带参数边界的可变参数拟合(示例,根据你的实际需求调整) bounds = ([0, 0, -np.inf], [np.inf, np.inf, np.inf]) popt, pcov = curve_fit(core_fit_func, x_data, y_data, p0=initial_guess, bounds=bounds) return popt, pcov def hold_parameter_curve_fit_0(x_data, y_data, initial_guess, fixed_vals, fixed_indices): # 场景0:固定指定参数的拟合 wrapped_func = build_fixed_param_wrapper(core_fit_func, fixed_vals, fixed_indices) # 提取可变参数的初始猜测 var_guess = [val for i, val in enumerate(initial_guess) if i not in fixed_indices] # 调用拟合,再合并参数得到完整结果 popt_var, pcov = curve_fit(wrapped_func, x_data, y_data, p0=var_guess) full_popt = list(popt_var) for idx, val in zip(fixed_indices, fixed_vals): full_popt.insert(idx, val) return np.array(full_popt), pcov
2. 在主文件中调用utilities.py的函数
现在你可以在原来的主文件里直接导入并使用这些封装好的函数,完全不需要关心内部的wrapper细节:
# 主文件(比如main.py) import numpy as np from utilities import ( variable_params_curve_fit_0, variable_params_curve_fit_1, hold_parameter_curve_fit_0 ) # 示例测试数据 x = np.linspace(0, 10, 100) y = 2.5 * np.exp(-0.3 * x) + 0.5 + np.random.normal(0, 0.1, size=100) # 调用可变参数拟合场景0 initial_guess = [2, 0.2, 0.4] popt0, pcov0 = variable_params_curve_fit_0(x, y, initial_guess) print("可变参数拟合0结果:", popt0) # 调用可变参数拟合场景1 popt1, pcov1 = variable_params_curve_fit_1(x, y, initial_guess) print("可变参数拟合1结果:", popt1) # 调用固定参数拟合场景0:固定第二个参数(索引1)为0.3 fixed_vals = [0.3] fixed_indices = [1] popt_hold, pcov_hold = hold_parameter_curve_fit_0(x, y, initial_guess, fixed_vals, fixed_indices) print("固定参数拟合0结果:", popt_hold)
3. 解决wrapper找不到wrapperNa...的问题
之前的wrapper找不到相关内容,大概率是因为wrapperNa...是定义在主文件局部作用域里的函数,迁移时没一起移到utilities.py。现在我们把所有wrapper相关的逻辑都封装到utilities.py的build_fixed_param_wrapper函数里,所有依赖都在同一个文件内,就不会出现找不到的问题了。如果你的wrapperNa...是特定命名的定制包装,直接把它的定义也复制到utilities.py即可。
内容的提问来源于stack exchange,提问作者Scott Ellis
相关产品推荐
相关产品推荐

