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

使用Astropy读取FITS文件PRIMARY HDU多维数据遇报错求解决

问题描述

我有一个FITS格式文件,通过Astropy读取表头信息如下:

from astropy.table import Table
from astropy.io import fits

fits.info('file.fits')

输出结果:

Filename: file.fits
No.    Name      Ver    Type      Cards   Dimensions   Format
  0  PRIMARY       1 PrimaryHDU      11   (150, 1, 1, 8, 8)   float32   
  1  WAVELENGTH    1 BinTableHDU     12   150R x 1C   [1E]   
  2  ANGLE         1 BinTableHDU     15   1R x 2C   [1E, 1E]   
  3  APERTURE      1 BinTableHDU     12   1R x 1C   [1E] 

我可以通过指定HDU读取1-3号表,例如执行Table.read('file.fits', format='fits', hdu=1)可读取WAVELENGTH表,得到150行1列的数据。但尝试从PRIMARY HDU(hdu=0)中提取特定列数据时,代码报错:

ValueError: No table found in hdu=0

我猜测是维度问题,但不知如何解决该报错并从PRIMARY HDU中提取目标数据。

解决方案

报错核心原因:PRIMARY HDU是PrimaryHDU类型(属于图像类HDU),并非表格类型HDU(比如1-3号的BinTableHDU),Table.read()只能识别表格结构的HDU,因此会触发报错。

要提取PRIMARY HDU的数据,需要用处理图像HDU的方式操作:

方法1:直接读取数据数组

使用fits.getdata()直接读取PRIMARY HDU的原始数据:

from astropy.io import fits

# 读取hdu=0的原始数据
primary_data = fits.getdata('file.fits', hdu=0)
# 此时primary_data是numpy数组,维度为(150, 1, 1, 8, 8)
print(primary_data.shape)

方法2:手动打开HDU列表访问数据

如果需要同时查看表头信息和数据,可以手动打开FITS文件:

from astropy.io import fits

with fits.open('file.fits') as hdul:
    # 获取PRIMARY HDU对象
    primary_hdu = hdul[0]
    # 提取数据数组
    primary_data = primary_hdu.data
    # 查看表头卡片详情
    primary_hdu.info()
    
# 根据需求提取特定维度的数据
# 示例:去掉两个大小为1的冗余维度,提取(150,8,8)结构的数据
target_data = primary_data[:, 0, 0, :, :]

维度简化技巧

PRIMARY HDU的维度包含两个大小为1的冗余维度,可以用numpy的squeeze()函数直接去除:

squeezed_data = primary_data.squeeze()
# 处理后维度变为(150, 8, 8)
print(squeezed_data.shape)

内容的提问来源于stack exchange,提问作者Ammar Bayyari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:53:13