如何使用statmorph包批量计算Excel表格中多星系的相关参数
批量计算星系Sersic模型的实现方法
首先确保你已经安装了所有依赖库:numpy、pandas、astropy,以及你需要用到的statmorph包。
完整实现代码
import numpy as np import pandas as pd from astropy.modeling import models # 后续计算statmorph目标参数时可取消下方注释 # import statmorph # 加载星系参数表格 df = pd.read_excel('galaxies.xlsx') # 按你的实际需求修改图像的宽、高数值 nx = 100 ny = 100 # 全局仅生成一次坐标网格,减少重复计算开销 y, x = np.mgrid[0:ny, 0:nx] # 用于存储所有星系的计算结果 results = [] # 遍历所有星系参数批量计算 for _, row in df.iterrows(): # 读取当前行的星系参数 obj_id = row['ObjectID'] # 注意:Sersic2D要求theta输入为弧度,表格中为角度需转换 theta_rad = np.deg2rad(row['theta']) # 生成当前星系的Sersic2D模型 sersic_model = models.Sersic2D( amplitude=row['amplitude'], r_eff=row['r_eff'], n=row['n'], x_0=row['x_0'], y_0=row['y_0'], ellip=row['ellip'], theta=theta_rad ) # 生成星系图像 galaxy_img = sersic_model(x, y) # 此处可补充你调用statmorph计算目标参数的代码 # 示例: morph = statmorph.SourceMorphology(galaxy_img, mask=None) # 存储结果,可根据你的需求新增字段 results.append({ 'ObjectID': obj_id, 'galaxy_image': galaxy_img # 补充你计算得到的其他参数,比如: # 'concentration': morph.concentration }) # 若需要将数值结果合并回原表格,可执行以下代码 # res_df = pd.DataFrame(results).drop('galaxy_image', axis=1) # df = pd.merge(df, res_df, on='ObjectID', how='left')
注意事项
- 上述代码默认所有星系的图像尺寸一致,若不同星系的图像尺寸不同,可将网格生成逻辑移动到循环内部,根据每个星系的参数动态调整nx、ny即可
- 5000个星系的计算量较小,上述写法完全可以满足需求,如果要进一步提升运行速度,可以将
df.iterrows()替换为df.itertuples(),遍历效率提升约10倍 - 如果你需要持久化存储生成的星系图像,可以使用astropy.io.fits包将数组存储为FITS文件,或使用PIL、matplotlib导出为普通图像格式
内容的提问来源于stack exchange,提问作者pythondeepspace
相关产品推荐
相关产品推荐

