用途
Astropy 是 Python 中天文学与天体物理学的核心库,也是该领域的社区标准。它通过把数值数组与物理单位、天球参考系关联起来,保证天文计算的可复现性与物理一致性。
典型使用场景包括:
- 在计算中处理物理单位与常数
- 处理天球坐标(赤经、赤纬)及参考系转换
- 读写 FITS(Flexible Image Transport System)、ASDF 和 VO(虚拟天文台)文件
- 管理天文时标(UTC、TAI、TDB、儒略日)
- 世界坐标系统(WCS)映射,即像素坐标与天区坐标的互转
- 宇宙学计算(距离、年龄、哈勃参数)
- 带单位与元数据的表格数据(astropy.table)
核心原则
单位与量:Astropy 中一切应表示为 Quantity,即数值或数组与 Unit 的配对,从而避免例如“米加英尺”这类量纲错误。
天球坐标:坐标由 SkyCoord 对象表示,自动处理球面三角与参考系岁差等复杂数学。
带单位的表格:Pandas 适合一般数据框,而 astropy.table.QTable 在物理场景中更合适,因为它在运算过程中保留单位。
安装与导入
安装命令:
pip install astropy
标准导入方式:
import numpy as np
from astropy import units as u
from astropy import constants as const
from astropy.coordinates import SkyCoord
from astropy.time import Time
from astropy.table import QTable
from astropy.io import fits
from astropy.wcs import WCS
主要能力
单位与常数(astropy.units)
支持复杂换算与等价关系(equivalencies),例如波长与频率互转、流量密度与亮温度互转,以及太阳单位换算。示例中展示了将 500 nm 转换为 THz、将 Jy 流量密度按观测频率转换为开尔文亮温度、把瓦特转换为太阳光度。
表格(astropy.table)
可用于管理天文星表。使用 QTable 创建带单位的表,支持按条件筛选、基于已有列计算新列(如由距离与流量计算光度),并可导出为 FITS 或 CSV。
坐标(astropy.coordinates)
支持从字符串创建坐标、参考系转换(如 ICRS 转银道坐标),以及结合观测地与观测时间转换到地平坐标(AltAz)。示例中给出了从 ICRS 坐标转换到银道坐标,以及给定纬度、经度、海拔与时刻计算高度角的方法。
时间(astropy.time)
支持儒略日与 ISO 时间互查、修正儒略日(MJD)、时间增量运算,以及恒星时计算。
FITS 与 WCS(astropy.io.fits、astropy.wcs)
可读取 FITS 文件的数据与头部信息,并由头部初始化 WCS,实现像素到天区坐标(pixel_to_world)以及天区坐标到像素(world_to_pixel)的双向映射。
关键规则
应当做到:
- 从一开始就给原始数值附加单位
- 优先使用 QTable 而非 Table,以保持列为 Quantity 对象
- 使用 SkyCoord 进行计算,不手写角距公式,改用 c1.separation(c2)
- 对坐标进行向量化,SkyCoord 可承载坐标数组,比循环快得多
- 创建 Time 对象时明确时标(utc、tdb)
- 读写 FITS 时使用上下文管理器以确保文件句柄关闭
不应做:
- 过早剥离单位,除非确实需要把数据传给非 Astropy 函数
- 硬编码常数,例如不要用 3e8 表示光速,而应使用 const.c
- 默认假设 J2000,应明确指定参考系(ICRS、FK5、Galactic)
- 忽略 WCS,不应假设像素是线性的
常见反模式
资料中列出的错误做法包括:手工单位换算(如 pc 乘 3.086e16 转米)、为配合 NumPy 函数剥离单位、手写赤经赤纬的平面距离公式做球面角距。正确做法分别是使用 u.pc 与 .to() 自动换算、直接对 Quantity 调用 np.mean(保留单位)、使用 SkyCoord 的 separation 方法。
实践工作流与性能
资料给出三个实践示例:由视差计算绝对星等(使用 u.parallax() 等价关系)、带单位校验的流量转星等(要求输入为 Quantity,否则报错)、以及基于 FlatLambdaCDM(如 H0=67.4、Om0=0.315)计算光度距离与回望时间。性能方面,可使用 astropy.utils.console.ProgressBar 显示长任务进度,并用 format='ascii.fast_csv' 加速读取大型 CSV 星表。
常见陷阱
- “剥离单位”问题:外部库不支持 Quantity 时,可用 .to_value(u.cm) 显式转换为目标单位后传值
- 循环中创建 SkyCoord 很慢,应改为一次性构造坐标数组
- 结果单位可能杂乱(如 m/km),可用 .decompose() 或 .simplify() 化简
参考资料
- 官方文档:https://docs.astropy.org/
- 学习站点:https://learn.astropy.org/
- 常用检索模式:astropy.units.Quantity、astropy.coordinates.SkyCoord、astropy.io.fits、astropy.time.Time
限制
除资料中提及的内容外,本条目未提供关于收费标准、授权许可、平台兼容性及其他未述功能的更多信息。