如何在Python中将XY轴与数据一同写入FITS文件?
当然可以啦!在Astropy的FITS模块里,有几种常用的方法能把x、y轴数据和你的矩阵一起保存到FITS文件中,下面给你详细说说两种最实用的方式:
方法一:将轴数据存入主HDU的表头
如果你的x、y轴数据是小型一维数组,直接把它们存入主HDU的表头(Header)是最便捷的方式,表头可以存储自定义关键字和对应的数据,还能添加注释说明。
修改你的代码如下:
import numpy as np from astropy.io import fits test_matrix = np.random.uniform(0,1,[5,3]) x = np.arange(5,5+len(test_matrix[:,0])) y = np.arange(5,5+len(test_matrix[0,:])) # 创建存储矩阵的主HDU hdu = fits.PrimaryHDU(test_matrix) # 将x、y轴数据转成列表存入表头,同时添加注释 hdu.header['X_AXIS'] = x.tolist() hdu.header.comments['X_AXIS'] = 'X axis values (start=5, length=5)' hdu.header['Y_AXIS'] = y.tolist() hdu.header.comments['Y_AXIS'] = 'Y axis values (start=5, length=3)' # 写入文件,加上overwrite=True避免文件已存在时报错 hdu.writeto('TestFITS_with_header.fits', overwrite=True)
读取时可以这样获取轴数据:
with fits.open('TestFITS_with_header.fits') as hdul: matrix_data = hdul[0].data # 将表头中的列表转回numpy数组 x_read = np.array(hdul[0].header['X_AXIS']) y_read = np.array(hdul[0].header['Y_AXIS'])
方法二:用扩展HDU独立存储轴数据
如果你的轴数据量较大,或者希望把轴数据作为独立的数据集来管理,推荐使用扩展HDU(Extension HDU)的方式。FITS文件支持多个HDU,我们可以用主HDU存矩阵,再创建单独的ImageHDU来存储x、y轴数据。
示例代码:
import numpy as np from astropy.io import fits test_matrix = np.random.uniform(0,1,[5,3]) x = np.arange(5,5+len(test_matrix[:,0])) y = np.arange(5,5+len(test_matrix[0,:])) # 主HDU存储矩阵数据 primary_hdu = fits.PrimaryHDU(test_matrix) # 创建扩展HDU存储x轴数据,指定名称方便读取 x_hdu = fits.ImageHDU(x, name='X_AXIS') x_hdu.header.comments['EXTNAME'] = 'Independent X axis dataset' # 创建扩展HDU存储y轴数据 y_hdu = fits.ImageHDU(y, name='Y_AXIS') y_hdu.header.comments['EXTNAME'] = 'Independent Y axis dataset' # 将所有HDU打包成HDU列表 hdul = fits.HDUList([primary_hdu, x_hdu, y_hdu]) # 写入文件 hdul.writeto('TestFITS_with_extensions.fits', overwrite=True)
读取时可以通过名称快速定位扩展HDU:
with fits.open('TestFITS_with_extensions.fits') as hdul: matrix_data = hdul[0].data # 通过名称获取扩展HDU的数据 x_data = hdul['X_AXIS'].data y_data = hdul['Y_AXIS'].data
两种方法的适用场景
- 表头存储:适合小型数组,操作简单,数据和矩阵绑定紧密;
- 扩展HDU存储:适合大数据量,或者需要单独处理轴数据的场景,更符合FITS文件的标准结构,可读性更强。
内容的提问来源于stack exchange,提问作者user8188120
相关产品推荐
相关产品推荐

