天文数据的利器-Fits文件

1. 什么是fits文件?

fits全称为Flexible Image Transport System,它是一种用于世界各地天文台之间数据传输、数据交换的一种数据格式。它描述了数据的定义和数据编码的一般方法,fits文件的缀名为.fits

2. fits文件的格式

一个fits文件包含多个HDU(primary header and data unit 基本头单元与数据单元),如下图,每一行都是一个HDU。

image-20220311175155059.png

每个HDU都是有header和data两部分组成。

  • header: 存储着对data中整体的描述信息和对每一列数据的描述信息(如TTYPE表示列名;TFORM表示列中数据类型,每一个字母都代表一种数据类型)。

image-20220311180002703.png

  • data: 存储着数据,可以是一维的、二维的等等。如下图,data中的数据是一个二维的数据,存放着发射线强度等信息。

image-20220311180226644.png

3. fits文件的读取

我们使用`astropy 提供的fits文件操作工具来进行fits文件的读取。首先要导入fits文件:

 from astropy.io import fits
复制代码

3.1 fits文件的读取及基本信息

通过fits.open(path)函数读取fits文件,获得含有多个HDU的list对象,通过下标的方式我们可以获取指定的hdu。

 hdu_list = fits.open("./fits_data/spec-0266-51602-0012.fits")
复制代码

当读取完毕后一定要使用hdu_list.close()方法关闭文件流,否则会占用大量的内存。

使用函数hdu_list.info()方法,我们可以查看当前fits文件的一些基本信息:

 """fits文件的读取及查看基本信息"""
 def demo01():
     hdu_list = fits.open("./fits_data/spec-0266-51602-0012.fits")
     print("fits文件基本信息:")
     hdu_list.info()
     hdu_list.close()
复制代码

输出:

扫描二维码关注公众号,回复: 13695854 查看本文章
 fits文件基本信息:
 Filename: ./fits_data/spec-0266-51602-0012.fits
 No.    Name      Ver    Type      Cards   Dimensions   Format
   0  PRIMARY       1 PrimaryHDU     122   ()      
   1  COADD         1 BinTableHDU     26   3837R x 8C   [E, E, E, J, J, E, E, E]   
   2  SPECOBJ       1 BinTableHDU    262   1R x 126C   [6A, 4A, 16A, 23,……,5E]   
   3  SPZLINE       1 BinTableHDU     48   29R x 19C   [J, J, J, 13,……, J, E, E]  
复制代码
  • 第一行filename: 表示当前读取fits文件的名称

  • 第二行:下面数据的标题

    1. No.:表示第几个hdu
    2. name: 当前hdu的名称
    3. Dimensions:当前hdu中data的数据维度,即行x列
    4. format:数据类型,I表示整型, J表示长整形, E表示浮点型, D表示双精度浮点型,A表示字符型

3.2 fits文件的数据操作

通过下标的方式我们从hdu list对象中获取一个hdu对象。通过hdu.header我们可以查看当前hdu的头文件

 """查看hdu的头文件"""
 def demo02():
     hdu_list = fits.open("./fits_data/spec-0266-51602-0012.fits")
     hdu = hdu_list[1]
     hdu_header = hdu.header
     print(hdu_header)
     hdu_list.close()  
复制代码

image-20220312112510423.png

通过.data的方式我们可以获得hdu的数据部分。返回值是类型是fits文件中特有的类型。

但我们按列获取后得到的是numpy.ndarray类型的数据对象。这时,我们就可以通过numpy和pandas来进行数据处理。

 """获取hdu数据部分"""
 def demo03():
     hdu_list = fits.open("./fits_data/spec-0266-51602-0012.fits")
     hdu = hdu_list[1]
     data = hdu.data
     print("hud data部分的数据类型为:",type(data))
     print(data)
     
     flux = hdu.data["flux"] # 等价于 hdu.data.field(‘flux’)
     print("\n hud data部分中 每一列 的数据类型为:",type(flux))
     print(flux)
     hdu_list.close()
 ​
复制代码

输出:

 hud data部分的数据类型为: <class 'astropy.io.fits.fitsrec.FITS_rec'>
 [( 8.7938795, 3.5803, 0.05449915,  0,       0, 1.2542306, 6.6273575,  6.400915 )
  (15.133193 , 3.5804, 0.04994194,  0,       0, 1.2539674, 6.350275 ,  6.7443757)
  ...
  (16.940786 , 3.9639, 0.42537764, 16,      16, 0.7964833, 4.486557 , 12.947592 )]
 ​
  hud data部分的数据类型为: <class 'numpy.ndarray'>
 [ 8.7938795 15.133193  10.525017  ... 12.286306  16.704823  16.940786 ]
复制代码

除此之外,我们可以通过hdu.data.names来查看所有的data部分的列名

 """查看hdu data 部分的列名"""
 def demo04():
     hdu_list = fits.open("./fits_data/spec-0266-51602-0012.fits")
     hdu = hdu_list[1]
     names = hdu.data.names
     print("hud data部分的列名为:")
     print(names)
     hdu_list.close()
复制代码

输出:

 hud data部分的列名为:
 ['flux', 'loglam', 'ivar', 'and_mask', 'or_mask', 'wdisp', 'sky', 'model']
复制代码

猜你喜欢

转载自juejin.im/post/7074065805767360520