使用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
相关产品推荐
相关产品推荐

