在Python中FITS格式文件数据的读取 (转载)
在Python中FITS格式文件數(shù)據(jù)的讀取 (轉(zhuǎn)載)
前言
\space\space\space\space ????FITS(Flexible Image Transport System)格式文件是天文學(xué)數(shù)據(jù)儲存的公用文件格式,在國際的天文數(shù)據(jù)存儲與傳輸中擔(dān)任著十分重要的角色。但是這種文件格式在其他科學(xué)領(lǐng)域并不常用,造成這方面的文件資料并不多,尤其是基礎(chǔ)性入門的指導(dǎo)性說明就更少了。其實(shí)我并不專業(yè),在這里只是想用自己的理解向有需要的同行簡單介紹一下,讓大家了解一些基礎(chǔ)的、容易理解的知識。
以下內(nèi)容適合剛剛接觸Python的天文初學(xué)者。
\space\space\space\space ????FITS文件有很多單元(Unit)組成,每個(gè)單元都包含記錄單元屬性信息的部分,叫做頭文件(Header),以及存儲數(shù)據(jù)的部分,叫做數(shù)據(jù)單元(Data),合起來就稱為HDU(Header and Data Unit),其中頭文件是必有的,數(shù)據(jù)單元可選。
代碼文件名稱:read_HXMT_fts.py
一、FITS文件單元的頭文件(header)的格式:
單元的頭文件由多行上述格式的代碼組成,每行80個(gè)字符,結(jié)尾以關(guān)鍵詞END結(jié)束??梢砸娤聢D:
每個(gè)關(guān)鍵字都有著相應(yīng)的值,在頭文件中存儲著文件的日期、大小、數(shù)據(jù)格式、數(shù)據(jù)來源、數(shù)據(jù)范圍、數(shù)據(jù)位數(shù)、坐標(biāo)軸數(shù)等等信息。
每一個(gè)文件必須含有SIMPLE、BITPIX、NAXIS和END關(guān)健字,并且必須是這一順序。在它們之間可以插入其它的行記錄。第一個(gè)記錄的關(guān)健字一定是SIMPLE,最后的行記錄是END。
SIMPLE:值為T表示是一個(gè)標(biāo)準(zhǔn)的FITS文件,否則為F。
BITPIX:值為8、1 6、32、一32或一64,表示圖象數(shù)據(jù)的格式。若為8、1 6、32,則數(shù)據(jù)為單字節(jié)、雙字節(jié)和4字節(jié)符號整數(shù),值為一32和一64代表數(shù)據(jù)為單精度和雙精度浮點(diǎn)數(shù),第一位為符號,接下來8位(單精度)或11位(雙精度)為冪,余下的為小數(shù)。但它們的存儲格式與PC機(jī)不同,它采用高字節(jié)在前,低字節(jié)在后的存儲方式。因此將FITS格式轉(zhuǎn)換為任何PC機(jī)或在PC 機(jī)上顯示FITS圖象都要考慮字節(jié)交換的問題。
NAXIS:圖象數(shù)據(jù)矩陣的維數(shù),對于2維圖象,它至少為2。NAXIS為0表示沒有數(shù)據(jù)。
NAXISi :當(dāng)NAXIS大于為0時(shí),其后必須按次序跟有NAXIS1、NAXIS2等等,表示每維的大小。每個(gè)NAXISi必須大于0。
END: 最后一個(gè)行記錄的關(guān)健字必須是END。其后為空格直到文件頭結(jié)束。
其他關(guān)健字都是可選的,在天文圖象中常用的還有DATE(日期)、UT(時(shí)間)、TELESCOPE(望遠(yuǎn)鏡)OBSERVER(觀測者)、OBJECT(目標(biāo))、EPocH(歷元)等等。常用的還確DATAMAX和DATAMIN(數(shù)據(jù)的最大和最小值),BSCALE和BZERO(實(shí)際值一BZREO+BSCAI B×圖象值).COMMENT(注釋)等。
二、Python中數(shù)據(jù)的簡單提取
先簡單說數(shù)據(jù)單元的格式,FITS文件的數(shù)據(jù)是以多維數(shù)組的形式存在的,常見的是二維數(shù)組,比較簡單的例子就是可以記錄一系列點(diǎn)的坐標(biāo)值信息,這樣數(shù)據(jù)形式就是N*2的二維數(shù)組。
Python要處理FITS文件,要提前安裝幾個(gè)擴(kuò)展包,針對FITS文件讀取的是astropy擴(kuò)展包,這個(gè)網(wǎng)站有很多Windows版非官方Python擴(kuò)展包,大家可以去哪里下載需要的東西。(2017/4更新:其實(shí)建議使用pip等包管理工具進(jìn)行安裝)
在Python中,我們首先要引入fits模塊,然后打開FITS文件,比如我的是下面這樣的(我的FITS文件)
from astropy.io import fitsfrom astropy.io import fits hdul_in = fits.open(file_name)#打開文件hdu是隨便寫的名字,可以換成別的,只要你愿意。hdu下有很多函數(shù),你可以輸入hdu.按Tab鍵查看,可以看到許多函數(shù),我們只需要了解我們需要的幾個(gè)就可以了。
我們可以通過info函數(shù)查看文件基本信息:
我們可以看到這個(gè)文件有兩個(gè)單元,其中PrimaryHDU是每個(gè)文件都有的,可以叫主單元,BinTableHDU屬于擴(kuò)展單元,在這里是包含數(shù)據(jù)的單元。那我們怎么查看里面的信息和數(shù)據(jù)呢?首先,先看輸出結(jié)果里的表示方法,每個(gè)單元是用1、2……標(biāo)記的,實(shí)際上FITS文件的每個(gè)單元組成了類似于一個(gè)“單元數(shù)組”的東西(我杜撰的詞),我們可以通過類似的方式進(jìn)行訪問,也就是hdu[0]便表示主單元,hdu[1]表示第一個(gè)擴(kuò)展單元。
(1)我們先看頭文件。單元的頭文件內(nèi)容可以用header方法進(jìn)行訪問,就像下面這樣,我們就看到了主單元的頭文件中的信息,正是必要的四個(gè)關(guān)鍵字。
header很像一個(gè)字典(dict),我不清楚到底是不是,因?yàn)檫@里一個(gè)關(guān)鍵字(keyname)對應(yīng)的不僅是值(value),還有注釋(comment)。因此,如果你要看頭文件中的SIMPLE的值,就可以用hdu[0].header[‘SIMPLE’],查看其注釋用hdu[0].header.comments[‘SIMPLE’]:
(2)再看數(shù)據(jù)單元。在上面的信息中我們可以看到擴(kuò)展單元中是有數(shù)據(jù)的,數(shù)據(jù)的維度是1000R*2C,這表示數(shù)據(jù)是1000行(rows)2列(column),格式(format)是雙精度,據(jù)我自己的觀察,各個(gè)字母表示含義如下:
? \bullet\space ??I表示整型;
? \bullet\space ??J表示長整形;
? \bullet\space ??E表示浮點(diǎn)型;
? \bullet\space ??D表示雙精度浮點(diǎn)型;
? \bullet\space ??A表示字符型;
所以這份文件的數(shù)據(jù)都是雙精度的浮點(diǎn)型。那怎么具體的訪問某一組數(shù)據(jù)、某一列數(shù)據(jù)或者某一個(gè)數(shù)據(jù)呢?這和前面是很類似的,hdu[1]中data能讓我們訪問其中的數(shù)據(jù),要訪問第i組數(shù)據(jù),可以用hdu[1].data[i],訪問第i組第j個(gè)(或者說第i行第j列)數(shù)據(jù)就是hdu[1].data[i][j],那么訪問一列的數(shù)據(jù)怎么辦呢?field可以做到這一點(diǎn),field就是字段的意思,也就是每一組數(shù)據(jù)包含的每個(gè)數(shù)據(jù)的代表含義。每個(gè)字段都在一列中,因此用field可以訪問某一列的數(shù)據(jù)。如下圖
另外,field字段都是有名字的,在data下用names可以查看字段名稱,并且在field()中輸入鍵值時(shí)也可以輸入名稱,field返回的是nparray,下面是例子:
到這里,相信就算沒有基礎(chǔ)的同學(xué)也可以把FITS文件里的數(shù)據(jù)拿出來進(jìn)行處理了。當(dāng)然我也并沒有熟練掌握,只是有著和其他初學(xué)者一樣的疑惑,更明白大家剛接觸這些東西時(shí)需要了解什么,希望能幫到大家。謝謝。
原文鏈接:點(diǎn)此進(jìn)入
總結(jié)
以上是生活随笔為你收集整理的在Python中FITS格式文件数据的读取 (转载)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 关于Quartz的简单使用
- 下一篇: python代码---银行卡冻结时间算法