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

如何从头生成FITS文件并定义其Header与Data?

从ASCII文件生成带自定义Header和Data的FITS图像(Astropy实现)

看来你已经搞定了从ASCII转FITS的基础操作,现在想深入到自定义Header和Data结构,让生成的FITS文件能像望远镜下载的光谱数据那样,方便单独调用Header和Data部分对吧?我用Astropy给你一步步演示怎么实现,完全贴合你给出的调用示例逻辑。

第一步:准备工具和读取ASCII数据

首先得把需要的库导入,然后把你的ASCII表读进来——假设你的ASCII是光谱数据,包含波长和通量两列:

import numpy as np
from astropy.io import fits
from astropy.io.ascii import read

# 读取ASCII文件,Astropy的read方法会自动识别列名(如果ASCII里有表头的话)
ascii_table = read('your_spectrum_data.ascii')

# 把需要的列转成numpy数组,作为FITS的Data部分
# 这里我把波长和通量拼成2D数组,你也可以只取单列做1D数据
fits_data = np.array([ascii_table['wavelength'], ascii_table['flux']])

第二步:手动构建自定义Header

FITS的Header就是一堆键值对,你可以像望远镜数据那样,添加标准关键字和自定义的观测信息。这里我模拟真实光谱FITS的Header结构来写:

# 创建一个空的Header对象
custom_header = fits.Header()

# 添加FITS标准关键字(必须的基础项)
custom_header['SIMPLE'] = True  # 符合FITS标准
custom_header['BITPIX'] = -64  # 表示64位浮点数,根据数据类型调整:-32是32位浮点数,8是字节型
custom_header['NAXIS'] = 2  # 数据维度:2D就设2,1D设1
custom_header['NAXIS1'] = len(ascii_table)  # 第一维的长度(数据点数量)
custom_header['NAXIS2'] = 2  # 第二维的长度(波长、通量两列)

# 添加自定义的观测元数据(可以根据你的需求随便加)
custom_header['OBSERVER'] = 'Justyna Piotrowska'
custom_header['TELESCOP'] = 'Your Telescope Name'
custom_header['DATE-OBS'] = '2024-05-20T14:20:00'  # ISO格式的观测时间
custom_header['WAVEUNIT'] = ('Angstrom', 'Wavelength unit')  # 带注释的关键字
custom_header['FLUXUNIT'] = ('erg/s/cm²/Å', 'Flux density unit')
custom_header['COMMENT'] = 'Converted from ASCII spectrum data'  # 备注信息

第三步:组合Header和Data,生成FITS文件

现在把Data和Header打包成HDU(FITS的核心单元),然后保存成文件:

# 创建Primary HDU(主数据单元),把Data和Header传进去
primary_hdu = fits.PrimaryHDU(data=fits_data, header=custom_header)

# 把HDU放到HDU列表里(FITS文件可以包含多个HDU,这里只需要一个主HDU)
hdu_list = fits.HDUList([primary_hdu])

# 保存FITS文件,overwrite=True表示覆盖已存在的文件
hdu_list.writeto('custom_spectrum.fits', overwrite=True)

第四步:验证生成的FITS文件

现在你可以像处理望远镜数据那样,单独调用Header和Data了,完全和你给出的示例一致:

# 打开生成的FITS文件
hdu = fits.open('custom_spectrum.fits', memmap=True)

# 获取Header
header = hdu[0].header
# 获取Data
data = hdu[0].data

# 打印Header看看效果
print(header)
# 打印Data的形状和前5个数据点
print(f"Data shape: {data.shape}")
print("First 5 wavelength-flux pairs:")
print(data[:, :5])

一些额外的小提示

  • BITPIX参数:不同数值对应不同数据类型,比如你要存整数可以用16(16位整数),存高精度浮点数用-64,根据你的数据需求选。
  • 1D vs 2D数据:如果只想生成单通量的1D图像,把NAXIS设为1,NAXIS1设为通量列的长度,fits_data直接用ascii_table['flux'].value就行。
  • 多HDU结构:如果你的ASCII有多个数据列想分开存,可以创建多个fits.ImageHDU,然后都加到HDUList里,读取的时候用hdu[1]、hdu[2]来调用。

内容的提问来源于stack exchange,提问作者Justyna Piotrowska

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:37:59