Python处理FITS插值求和报float不可迭代错误解决方法
错误原因
TypeError: 'float' object is not iterable触发原因:插值返回的f_int是一维数值数组,转为列表intflux后,intflux[0]是列表内存储的单个浮点数,而sum()函数要求传入可迭代对象(列表、数组等序列类型),无法对单个浮点数执行求和。
正确实现逻辑
要完成所有插值结果对应位置求和、计算平均值,按以下规则调整即可:
- 把依赖导入语句放到循环外,不要每次循环都重复导入
- 初始化一个和插值波长
w_int长度完全一致的全0数组,用于存储所有文件插值结果的逐位累加值 - 遍历每个fits文件完成插值后,直接将当前插值得到的通量数组逐位累加到总和数组中,不需要额外转成Python原生list
- 所有文件遍历完成后,将总和数组除以文件总数量,得到每个波长位置对应的平均通量
- 操作完成后记得关闭fits文件句柄,避免内存泄漏
修正后可直接运行的代码
import numpy as np from astropy.io import fits from scipy.interpolate import interp1d # 初始化逐位求和的总和数组,长度与插值波长w_int保持一致 total_flux = np.zeros_like(w_int) total_file_num = len(fitsfiles) for file_path in fitsfiles: hdul = fits.open(file_path) flux = hdul[1].data['FLUX'] waves = hdul[1].data['WAVE'] # 执行插值 interp_func = interp1d(waves, flux, fill_value='interpolate') current_interp_flux = interp_func(w_int) # 逐位累加当前文件的插值结果 total_flux += current_interp_flux # 关闭文件句柄 hdul.close() # 计算对应位置的平均通量 avg_flux = total_flux / total_file_num
格式化输出方法
如果需要输出波长和对应平均通量的两列结果,直接遍历两个数组打印即可,可自行调整小数保留位数匹配需求样式:
for wave, flux in zip(w_int, avg_flux): print(f"{wave:.3f}\t{flux:.6f}")
注:不需要将numpy数组转成list再做计算,numpy原生支持逐位四则运算,计算效率远高于Python原生列表,也能避免很多索引操作相关的错误。
内容的提问来源于stack exchange,提问作者Walker
相关产品推荐
相关产品推荐

