如何对矩阵多列数据批量执行Gaussian拟合并保存结果
批量高斯拟合解决方案
我来帮你搞定这个批量处理每列高斯拟合的问题!你的现有代码只处理了第一列,核心问题是没有正确遍历所有列,而且还有几个细节需要调整,下面是完整的解决方案:
首先修正基础问题
你的导入语句有语法错误,而且x轴的长度和每列数据的长度不匹配(你说每列有100个数值,但原代码里x只有50个点),这些都会导致后续循环出问题。
完整代码实现
from astropy.io import fits from astropy.modeling import models, fitting import numpy as np # 1. 读取FITS数据(用with语句自动管理文件,避免句柄泄漏) with fits.open('Image.fits') as Image1: Image_data = Image1.data[:,:] # 2. 确保x轴长度和每列数据一致(每列100个数值,对应生成100个点) x = np.linspace(-50, 50, 100) # 3. 初始化拟合器和结果存储数组 num_columns = Image_data.shape[1] # 获取总列数(这里是1024) fit_results = np.zeros((num_columns, 3)) # 每行存储[振幅, 均值, 标准差]三个参数 fitter = fitting.LevMarLSQFitter() # 4. 遍历每列执行拟合 for col_idx in range(num_columns): # 关键:每次循环重新初始化高斯模型,避免上一次拟合的参数残留影响结果 gauss_model = models.Gaussian1D(amplitude=1000., mean=0, stddev=1.) # 获取当前列的数值 y_data = Image_data[:, col_idx] # 执行拟合 fitted_model = fitter(gauss_model, x, y_data) # 保存拟合后的参数到结果数组 fit_results[col_idx, 0] = fitted_model.amplitude.value fit_results[col_idx, 1] = fitted_model.mean.value fit_results[col_idx, 2] = fitted_model.stddev.value # 可选:将结果保存到本地文件(比如numpy的npy格式,方便后续读取) np.save('gauss_fit_results.npy', fit_results)
关键细节说明
- 每次重新初始化模型:
LevMarLSQFitter会原地修改传入的模型对象,如果重复使用同一个模型,下一次拟合会以上一次的结果作为初始值,容易导致拟合偏差或收敛失败。 - 维度匹配:必须保证x的长度和每列数据的长度完全一致,否则拟合时会抛出维度不匹配的错误。
- 异常处理(可选):如果部分列的数据不符合高斯分布导致拟合失败,可以加入try-except块捕获异常,用NaN标记失败的列:
for col_idx in range(num_columns): try: gauss_model = models.Gaussian1D(amplitude=1000., mean=0, stddev=1.) y_data = Image_data[:, col_idx] fitted_model = fitter(gauss_model, x, y_data) fit_results[col_idx] = [fitted_model.amplitude.value, fitted_model.mean.value, fitted_model.stddev.value] except Exception as e: print(f"列 {col_idx} 拟合失败: {str(e)}") fit_results[col_idx] = [np.nan, np.nan, np.nan]
内容的提问来源于stack exchange,提问作者Marcus K.
相关产品推荐
相关产品推荐

