Python中FITS格式⽂件数据的读取
FITS(Flexible Image Transport System)格式⽂件是天⽂学数据储存的公⽤⽂件格式,在国际的天⽂数据存储与传输中担任着⼗分重要的⾓⾊。但是这种⽂件格式在其他科学领域
并不常⽤,造成这⽅⾯的⽂件资料并不多,尤其是基础性⼊门的指导性说明就更少了。
我本⼈也是初学天⽂的学⽣,对于⼀些特殊情况,可能学⽣们突然接触这类⽂件格式,有可能不知所措。如果⽼师们讲的⽐较详细的话,学⽣还能听懂,但若是学⽣不得不⾃⼰
⾃学掌握,可能就很难有⼀个感性的理解。其实我并不专业,在这⾥只是想⽤⾃⼰的理解向有需要的同⾏简单介绍⼀下,让⼤家了解⼀些基础的、容易理解的知识。
以下内容适合刚刚接触Python的天⽂初学者。
2017/4更新:发现这篇⽂章还有挺多⼈看的,就更新了⼀次,最主要的是更正了⼀些错误(其中有⼀个严重的概念错误),其他的包括把图⽚换成了新的,以及补充了⼀些信息和修改了⼀些错别字。
FITS⽂件有很多单元(Unit)组成,每个单元都包含记录单元属性信息的部分,叫做头⽂件(Header),以及存储数据的部分,叫做数据单元(Data),合起来就称为
HDU(Header and Data Unit),其中头⽂件是必有的,数据单元可选。
⼀、FITS⽂件单元的头⽂件(header)的格式:
单元的头⽂件由多⾏上述格式的代码组成,每⾏80个字符,结尾以关键词END结束。可以见下图:
每个关键字都有着相应的值,在头⽂件中存储着⽂件的⽇期、⼤⼩、数据格式、数据来源、数据范围、数据位数、坐标轴数等等信息。python怎么读取py文件
每⼀个⽂件必须含有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⽂件,⽐如我的是下⾯这样的()
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].headerments['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()中输⼊键值时也可以输⼊名称,下⾯是例⼦:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。