如何读取FITS

2025-10-26 00:34:52

1、FITS文件有很多单元(HDUs)组成,这些单元或者是记录文件属性信息的,叫做头单元(Head Units),或者是存储数据的,叫做数据单元(Data Units),这些单元就可以总称为HDUs(Head/Data Units),其中头单元是必有的,数据单元可选。

2、一、FITS文件的头文件格式:

 1-8 9 10 11-80

 KETNAME =  VALUE/COMMENT

头文件由多行上述格式的代码组成,每行80个字符,一共有36n行,结尾以END结束。可以见下图:

每个关键字都有着相应的值,在头文件中存储着文件的日期、大小、数据格式、数据来源、数据范围、数据位数、坐标轴数等等信息。

每一个文件必须含有SIMPLE、BITPIX、NAXIS和END关健字,并且必须是这一顺序。在它们之间可以插入其它的行记录。第一个记录的关健字一定是SIMPLE,最后的行记录是END。

SIMPLE:值为T表示是一个标准的FITS文件,否则为F。

BITPIX:值为8、1 6、32、一32或一64,表示图象数据的格式。若为8、1 6、32,则数据为单字节、双字节和4字节符号整数,值为一32和一64代表数据为单精度和双精度浮点数,第一位为符号,接下来8位(单精度)或11位(双精度)为幂,余下的为小数。但它们的存储格式与PC机不同,它采用高字节在前,低字节在后的存储方式。因此将FITS格式转换为任何PC机或在PC 机上显示FITS图象都要考虑字节交换的问题。

NAXIS:图象数据矩阵的维数,对于2维图象,它至少为2。NAXIS为0表示没有数据。

NAXISi:当NAXIS大于为0时,其后必须按次序跟有NAXIS1、NAXIS2等等,表示每维的大小。每个NAXISi必须大于0。

END: 最后一个行记录的关健字必须是END。其后为空格直到文件头结束。

其他关健字都是可选的,在天文图象中常用的还有DATE(日期)、UT(时间)、TELESCOPE(望远镜)OBSERVER(观测者)、OBJECT(目标)、EPocH(历元)等等。常用的还确DATAMAX和DATAMIN(数据的最大和最小值),BSCALE和BZERO(实际值一BZREO+BSCAI B×图象值).COMMENT(注释)等。

如何读取FITS

3、二、Python中数据的简单提取

先简单说数据单元的格式,FITS文件的数据是以多维数组的形式存在的,常见的是二维数组,比较简单的例子就是可以记录一系列点的坐标值信息,这样数据形式就是N*2的二维数组。

Python要处理FITS文件,要提前安装几个扩展包,针对FITS文件读取的是astropy扩展包,Python扩展包下载这个网站有很多非官方Python扩展包,大家可以去哪里下载需要的东西。

在Python命令行中,我们首先要引入fits模块,然后打开FITS文件,比如我的是下面这样的(我的FITS文件)

hdu是随便写的名字,可以换成别的,只要你愿意。hdu下有很多函数,你可以输入hdu.按Tab键查看,可以看到许多函数,我们只需要了解我们需要的几个就可以了。

我们可以通过info函数查看文件基本信息。我们可以看到这个文件有两个单元,其中PrimaryHDU是每个文件都有的,也就是头单元,BinTableHDU便是数据单元了。那我们怎么查看里面的信息和数据呢?首先,先看输出结果里的表示方法,每个单元是用1、2……标记的,实际上FITS文件的每个单元组成了类似于一个“单元数组”的东西(我杜撰的词),我们可以通过类似的方式进行访问,也就是hdu[0]便表示头单元,hdu[1]表示数据单元。

(1)我们先看头单元。其实我刚才说的并不准确,hdu[0]并不等价于头单元,头单元内容可以用header方法进行访问,就像下面这样,我们就看到了头单元中的信息,正是必要的四个关键字。

header很像一个字典(dict),我不清楚到底是不是,因为这里一个关键字(keyname)对应的不仅是值(value),还有注释(comment)。因此,如果你要看头单元中的SIMPLE的值,就可以用hdu[0].header['SIMPLE'],查看其注释用hdu[0].header.comments['SIMPLE']

(2)再看数据单元。在上面的信息中我们可以看到数据的维度是1000R*2C,这表示数据是1000行(rows)2列(column),格式(format)是双精度,据我自己的观察,各个字母表示含义如下:

I表示整型;

J表示长整形;

E表示浮点型;

D表示双精度浮点型;

A表示字符型;

字母前有数字表示一个列表,如10E表示长度为10的浮点型数组;

所以这份文件的数据都是双精度的浮点型。那怎么具体的访问某一组数据、某一列数据或者某一个数据呢?这和前面是很类似的,hdu[1]中data能让我们访问其中的数据,要访问第i组数据,可以用hdu[1].data[i],访问第i组第j个(或者说第i行第j列)数据就是hdu[1].data[i][j],那么访问一列的数据怎么办呢?field可以做到这一点,field就是字段的意思,也就是每一组数据包含的每个数据的代表含义。每个字段都在一列中,因此用filed可以访问某一列的数据。如下图

(中间省略)另外,field字段都是有名字的,在data下用name可以查看字段名称,并且在field()中输入键值时也可以输入名称,下面是例子:

到这里,相信就算没有基础的同学也可以把FITS文件里的数据拿出来进行处理了。当然我也并没有熟练掌握,只是有着和其他初学者一样的疑惑,更明白大家刚接触这些东西时需要了解什么,希望能帮到大家。谢谢。

如何读取FITS

如何读取FITS

如何读取FITS

如何读取FITS

如何读取FITS

如何读取FITS

如何读取FITS

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢