You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:06:31