Python中FITS格式文件數據的讀取


FITS(Flexible Image Transport System)格式文件是天文學數據儲存的公用文件格式,在國際的天文數據存儲與傳輸中擔任着十分重要的角色。但是這種文件格式在其他科學領域並不常用,造成這方面的文件資料並不多,尤其是基礎性入門的指導性說明就更少了。

我本人也是初學天文的學生,對於一些特殊情況,可能學生們突然接觸這類文件格式,有可能不知所措。如果老師們講的比較詳細的話,學生還能聽懂,但若是學生不得不自己自學掌握,可能就很難有一個感性的理解。其實我並不專業,在這里只是想用自己的理解向有需要的同行簡單介紹一下,讓大家了解一些基礎的、容易理解的知識。
以下內容適合剛剛接觸Python的天文初學者。
 
2017/4更新:發現這篇文章還有挺多人看的,就更新了一次,最主要的是更正了一些錯誤(其中有一個嚴重的概念錯誤),其他的包括把圖片換成了新的,以及補充了一些信息和修改了一些錯別字。
 
 
FITS文件有很多單元(Unit)組成,每個單元都包含記錄單元屬性信息的部分,叫做頭文件(Header),以及存儲數據的部分,叫做數據單元(Data),合起來就稱為HDU(Header and  Data Unit),其中頭文件是必有的,數據單元可選。
 
一、FITS文件單元 頭文件(header)的 格式:
 
在Python中FITS格式文件數據的讀取

 

單元的頭文件由多行上述格式的代碼組成,每行80個字符,結尾以關鍵詞END結束。可以見下圖
 
在Python中FITS格式文件數據的讀取

每個關鍵字都有着相應的值,在頭文件中存儲着文件的日期、大小、數據格式、數據來源、數據范圍、數據位數、坐標軸數等等信息。
 
每一個文件必須含有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(歷元)等等。常用的還確DATAMAXDATAMIN(數據的最大和最小值),BSCALEBZERO(實際值一BZREO+BSCAI B×圖象值).COMMENT(注釋)等。
 
二、Python中數據的簡單提取
 
先簡單說數據單元的格式,FITS文件的數據是以多維數組的形式存在的,常見的是二維數組,比較簡單的例子就是可以記錄一系列點的坐標值信息,這樣數據形式就是N*2的二維數組。
 
Python要處理FITS文件,要提前安裝幾個擴展包,針對FITS文件讀取的是astropy擴展包, 這個網站 有很多Windows版非官方Python擴展包,大家可以去哪里下載需要的東西。(2017/4更新:其實建議使用pip等包管理工具進行安裝)
 
在Python中,我們首先要引入fits模塊,然后打開FITS文件,比如我的是下面這樣的( 我的FITS文件
 
在Python中FITS格式文件數據的讀取
 
hdu是隨便寫的名字,可以換成別的,只要你願意。hdu下有很多函數,你可以輸入hdu.按Tab鍵查看,可以看到許多函數,我們只需要了解我們需要的幾個就可以了。
 
在Python中FITS格式文件數據的讀取

我們可以通過info函數查看文件基本信息:
 
在Python中FITS格式文件數據的讀取

我們可以看到這個文件有兩個單元,其中PrimaryHDU是每個文件都有的,可以叫主單元,BinTableHDU屬於擴展單元,在這里是包含數據的單元。那我們怎么查看里面的信息和數據呢?首先,先看輸出結果里的表示方法,每個單元是用1、2……標記的,實際上FITS文件的每個單元組成了類似於一個“單元數組”的東西(我杜撰的詞),我們可以通過類似的方式進行訪問,也就是hdu[0]便表示主單元,hdu[1]表示第一個擴展單元。
 
 
(1)我們先看頭文件。單元的頭文件內容可以用header方法進行訪問,就像下面這樣,我們就看到了主單元的頭文件中的信息,正是必要的四個關鍵字。
 
在Python中FITS格式文件數據的讀取

header很像一個字典(dict),我不清楚到底是不是 ,因為這里一個關鍵字(keyname)對應的不僅是值(value),還有注釋(comment)。因此,如果你要看頭文件中的SIMPLE的值,就可以用hdu[0].header['SIMPLE' ],查看其注釋用hdu[0].header.comments['SIMPLE']:
 
在Python中FITS格式文件數據的讀取

(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可以訪問某一列的數據。如下圖
 
在Python中FITS格式文件數據的讀取
(后面很長的列表省略掉了)
 
另外,field字段都是有名字的,在data下用names可以查看字段名稱,並且在field()中輸入鍵值時也可以輸入名稱,下面是例子:


在Python中FITS格式文件數據的讀取

到這里,相信就算沒有基礎的同學也可以把FITS文件里的數據拿出來進行處理了。當然我也並沒有熟練掌握,只是有着和其他初學者一樣的疑惑,更明白大家剛接觸這些東西時需要了解什么,希望能幫到大家。謝謝。

轉載:http://blog.sina.com.cn/s/blog_cfb724900102uz4p.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM