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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:23:24