原文地址:http://blog.sina.com.cn/s/blog_cfb724900102uz4p.html(如转载有不妥之处,请通知即删除转载)
FITS(Flexible
Image Transport System)格式文件是天文学数据储存的公用文件格式,在国际的天文数据存储与传输中担任着十分重要的角色。但是这种文件格式在其他科学领域并不常用,造成这方面的文件资料并不多,尤其是基础性入门的指导性说明就更少了。
我本人也是初学天文的学生,对于一些特殊情况,可能学生们突然接触这类文件格式,有可能不知所措。如果老师们讲的比较详细的话,学生还能听懂,但若是学生不得不自己自学掌握,可能就很难有一个感性的理解。其实我并不专业,在这里只是想用自己的理解向有需要的同行简单介绍一下,让大家了解一些基础的、容易理解的知识。
以下内容适合刚刚接触Python的天文初学者。
FITS文件有很多单元(Unit)组成,每个单元都包含记录单元属性信息的部分,叫做头文件(Header),以及存储数据的部分,叫做数据单元(Data),合起来就称为HDU(Header
andData
Unit),其中头文件是必有的,数据单元可选。
一、FITS文件单元的头文件(header)的格式
单元的头文件由多行上述格式的代码组成,每行80个字符,结尾以关键词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(注释)等。
二、Python中数据的简单提取
先简单说数据单元的格式,FITS文件的数据是以多维数组的形式存在的,常见的是二维数组,比较简单的例子就是可以记录一系列点的坐标值信息,这样数据形式就是N*2的二维数组。
Python要处理FITS文件,要提前安装几个扩展包,针对FITS文件读取的是astropy扩展包,这个网站有很多Windows版非官方Python扩展包,大家可以去哪里下载需要的东西。(2017/4更新:其实建议使用pip等包管理工具进行安装)
在Python中,我们首先要引入fits模块,然后打开FITS文件,比如我的是下面这样的(我的FITS文件)
hdu是随便写的名字,可以换成别的,只要你愿意。hdu下有很多函数,你可以输入hdu.按Tab键查看,可以看到许多函数,我们只需要了解我们需要的几个就可以了。
我们可以通过info函数查看文件基本信息:
我们可以看到这个文件有两个单元,其中PrimaryHDU是每个文件都有的,可以叫主单元,BinTableHDU属于扩展单元,在这里是包含数据的单元。那我们怎么查看里面的信息和数据呢?首先,先看输出结果里的表示方法,每个单元是用1、2……标记的,实际上FITS文件的每个单元组成了类似于一个“单元数组”的东西(我杜撰的词),我们可以通过类似的方式进行访问,也就是hdu[0]便表示主单元,hdu[1]表示第一个扩展单元。
(1)我们先看头文件。单元的头文件内容可以用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表示字符型;
所以这份文件的数据都是双精度的浮点型。那怎么具体的访问某一组数据、某一列数据或者某一个数据呢?这和前面是很类似的,hdu[1]中data能让我们访问其中的数据,要访问第i组数据,可以用hdu[1].data[i],访问第i组第j个(或者说第i行第j列)数据就是hdu[1].data[i][j],那么访问一列的数据怎么办呢?field可以做到这一点,field就是字段的意思,也就是每一组数据包含的每个数据的代表含义。每个字段都在一列中,因此用field可以访问某一列的数据。如下图
另外,field字段都是有名字的,在data下用names可以查看字段名称,并且在field()中输入键值时也可以输入名称,下面是例子:
到这里,相信就算没有基础的同学也可以把FITS文件里的数据拿出来进行处理了。当然我也并没有熟练掌握,只是有着和其他初学者一样的疑惑,更明白大家刚接触这些东西时需要了解什么,希望能帮到大家。谢谢。
转载本文请联系原作者获取授权,同时请注明本文来自刘念平科学网博客。
链接地址:http://blog.sciencenet.cn/blog-419514-1196627.html
上一篇:我的一周课程表
下一篇:汽车自动驾驶分级--L0-L6