FITS文件头与数据维度不匹配,修改后数据错乱问题求助
解决FITS文件头与数据维度不匹配及数据错乱问题
问题背景
原FITS文件头信息:
NAXIS1 = 761
NAXIS2 = 1297
NAXIS3 = 833
读取后数据维度为 data.shape = (833,1297,761),尝试通过np.moveaxis调整数据:
data_new = np.moveaxis( data,0,2 ) data_new = np.moveaxis( data_new,0,1 ) hdul[0].data = data_new
得到data_new.shape = (761,1297,833),保存后重新加载,发现数据错乱,且文件头被自动修改为:
NAXIS1 = 833
NAXIS2 = 1297
NAXIS3 = 761
核心原因
FITS文件的维度存储规则和NumPy数组的shape顺序不一致:
- FITS的维度顺序为
(NAXIS1, NAXIS2, NAXIS3),对应数据的物理维度(如x、y、z) - NumPy读取FITS后,数组的shape顺序为
(NAXIS3, NAXIS2, NAXIS1)(即FITS的最后一个维度对应数组的第一个维度) - 直接修改
hdul[0].data时,astropy.io.fits会自动根据新数组的shape更新文件头的NAXIS参数,导致物理维度对应关系错乱。
解决方法
方案1:按FITS规范调整数据,保留原文件头
如果原文件头的NAXIS参数是正确的(对应真实物理维度),用transpose调整数据到正确对应关系,同时手动同步文件头:
import numpy as np from astropy.io import fits cubefits = 'data.fits' hdul = fits.open(cubefits, mode='update') data = hdul[0].data # 将数组从(833,1297,761)转成(761,1297,833),匹配物理维度(x,y,z) data_new = data.transpose(2, 1, 0) # 手动设置文件头NAXIS参数,避免自动更新导致错乱 hd = hdul[0].header hd['NAXIS1'] = 761 # x维度 hd['NAXIS2'] = 1297 # y维度 hd['NAXIS3'] = 833 # z维度 hdul[0].data = data_new hdul.flush() # 确保修改写入磁盘 hdul.close()
方案2:自动匹配数组与文件头(需明确维度对应关系)
若希望文件头自动匹配数组shape,需遵循FITS的映射规则:数组shape的最后一维对应NAXIS1,中间对应NAXIS2,第一维对应NAXIS3。此时只需确保数据物理维度与该映射一致:
import numpy as np from astropy.io import fits cubefits = 'data.fits' hdul = fits.open(cubefits, mode='update') data = hdul[0].data # 调整数据到目标shape,让FITS自动更新文件头 data_new = data.transpose(2, 1, 0) hdul[0].data = data_new hdul.flush() hdul.close()
注意:此方案下文件头NAXIS参数对应数组的(shape[2], shape[1], shape[0]),需记录物理维度与NAXIS的对应关系,避免后续混淆。
关键提示
- 多维度调整优先用
transpose,比moveaxis更直观,便于对应物理维度 - 修改数据后先调用
hdul.flush()再关闭文件,确保修改完全写入 - 始终明确物理维度与FITS NAXIS参数、NumPy数组shape的对应关系,这是避免错乱的核心
内容的提问来源于stack exchange,提问作者Raizen
相关产品推荐
相关产品推荐

