如何修复TypeError: only size-1 arrays转Python标量报错
报错原因
math.log10是Python标准库的标量计算函数,仅支持传入单个数值作为参数。你通过astropy读取的FITS表列ni/ha/ox/hb都是数组结构,存储了全表所有天体的对应测量值,直接传入math.log10就会触发你看到的类型错误。- 你的代码存在笔误:计算
ry时写的mathlog10(hb)缺少点号分隔,正确写法是math.log10(hb),不修正的话后续会触发属性错误。 - 你提到使用numpy计算会出现可视化错误,这类问题通常不是numpy计算逻辑的问题,多是没有提前过滤流量小于等于0的无效样本——非正数无法计算对数,会生成
nan或inf值干扰绘图结果。如果你确实不想使用numpy的向量化计算方法,通过逐元素遍历的方式就可以解决问题,完全不需要调用numpy的数学函数。
修复代码
直接替换你原来计算rx、ry的部分即可,读取FITS文件的代码不需要改动:
import math datos = fits.open('gal_line_dr7_v5_2.fit') dat = datos[1].data ox = datos[1].data['OIII_5007_CONT'] ni = datos[1].data['NII_6548_CONT'] ha = datos[1].data['H_alpha_CONT'] hb = datos[1].data['H_beta_CONT'] rx = [] ry = [] # 逐样本遍历计算 for ni_val, ha_val, ox_val, hb_val in zip(ni, ha, ox, hb): # 跳过流量非正的无效样本,避免对数域错误 if ni_val <= 0 or ha_val <=0 or ox_val <=0 or hb_val <=0: continue rx.append(math.log10(ni_val) - math.log10(ha_val)) ry.append(math.log10(ox_val) - math.log10(hb_val))
说明
- 上述代码完全使用
math模块的标量函数逐值计算,没有调用numpy的数学计算接口,计算结果和手动逐个计算单样本值完全一致,不会出现你提到的numpy计算导致的可视化偏差。 - 计算完成后
rx和ry是等长的Python列表,仅包含有效样本的计算结果,可以直接传入matplotlib的绘图函数使用。
内容的提问来源于stack exchange,提问作者Hache 99
相关产品推荐
相关产品推荐

