FITSファイル処理 (astropy.io.fits

序言:序言

♪the astropy.io.fits PackageはFITSファイルへのアクセスを提供する.FITS(Flexible Image Transport System)は携帯型ファイル標準であり,天文学分野で広く用いられており,画像やテーブルを格納するために用いられている.

スタート

本節では,どのように利用するかについて概説する astropy.io.fits それがそうです。我々の目標は、あまり詳細に触れずに、このソフトウェアパッケージの基本機能を提示することである。初めてご利用になったことやご利用されたことがない場合は astropy PyFITS、これがあなたが始めるべきところです。別項参照 FAQ 一般的な問題や問題の解答を得る.

注釈

FITS形式で単一のテーブルを読み出したり書き込みたい場合は、高度な方法で推奨されています 統一ファイル読み書きインタフェース それがそうです。特にご参照ください Unified I/O FITS 一節です。

既存のFITSファイルの読み込みと更新

FITSファイルを開く

注釈

♪the astropy.io.fits.util.get_testdata_filepath() 関数(ここの例では使用される)は、一緒に提供されるデータにアクセスするために使用される astropy それがそうです。ご自分のデータに変更する場合は、ご利用ください astropy.io.fits.open() 相対経路または絶対経路を採用する。

一旦 astropy.io.fits カバンは標準的な約束を使ってロードします 1, 既存のFITSファイルを開くことができます:

>>> from astropy.io import fits
>>> fits_image_filename = fits.util.get_testdata_filepath('test0.fits')

>>> hdul = fits.open(fits_image_filename)

♪the open() 関数にはいくつかのオプションパラメータがあり,これらのパラメータは後述する.上の例に示すように,デフォルトモードは“読み出しのみ”である.OPEN関数は名前を返します HDUList これは1つです list -HDUオブジェクトのセットに類似しています。HDU(ヘッダデータユニット)はFITSファイル構造の最上位コンポーネントであり、ヘッダと(通常)データ配列またはテーブルからなる。

以上のような公開呼びかけの後、 hdul[0] 主なHDUです hdul[1] 最初の拡張HDUなど(拡張があれば)であり、以下同様である。なお、 astropy HDUとヘッダカードを引用する際にはゼロからのインデックスを用いるが,FITS標準(設計時にFortranを考慮)は1からのインデックスを用いる.

♪the HDUList 有用な方法があります HDUList.info() これは、開いたFITSファイルの内容をまとめています。

>>> hdul.info()
Filename: ...test0.fits
No.    Name      Ver    Type      Cards   Dimensions   Format
  0  PRIMARY       1 PrimaryHDU     138   ()
  1  SCI           1 ImageHDU        61   (40, 40)   int16
  2  SCI           2 ImageHDU        61   (40, 40)   int16
  3  SCI           3 ImageHDU        61   (40, 40)   int16
  4  SCI           4 ImageHDU        61   (40, 40)   int16

開いたファイルを処理した後、使用します HDUList.close() 方法:

>>> hdul.close()

以下のコマンドを使用してファイルを手動で閉じることを避けることができます open() シナリオ管理者として:

>>> with fits.open(fits_image_filename) as hdul:
...     hdul.info()
Filename: ...test0.fits
No.    Name      Ver    Type      Cards   Dimensions   Format
  0  PRIMARY       1 PrimaryHDU     138   ()
  1  SCI           1 ImageHDU        61   (40, 40)   int16
  2  SCI           2 ImageHDU        61   (40, 40)   int16
  3  SCI           3 ImageHDU        61   (40, 40)   int16
  4  SCI           4 ImageHDU        61   (40, 40)   int16

脱退後に with 範囲ファイルは自動的にオフになります。これは、異常が発生してもファイルを閉じることができるので、Pythonでファイルを開くのが好ましい方法です。

もしファイルが開いていたら lazy_load_hdus=False HDUListをオフにした後、すべてのヘッダにアクセスできます。ヘッダおよびデータはアクセス可能である可能性があり、アクセスできない可能性もあり、特にデータがタッチされているかどうか、およびメモリマッピングされているかどうかに依存します。詳細については、次の章を参照して

大書類を処理する

♪the open() 関数サポート memmap=True パラメータは,mmapを用いて各HDUの配列データへのアクセスを許可し,一度にすべてメモリに読み込むのではない.これは,物理メモリを完全に組み込むことができない非常に大きな配列を扱うのに特に有用である.ここ、ここ memmap=True デフォルトの場合、その値は構成項から取得されます。 astropy.io.fits.Conf.use_memmap それがそうです。

これは、いくつかの動作(例えば、配列データの順序読み出し)がいくつかのオーバヘッドを生じる可能性があるにもかかわらず、より小さいファイルへの影響も小さい。32ビットシステムでは、2~3 GBより大きい配列をmmap‘dすることはできない(いずれにしても、その時点で物理メモリが枯渇する可能性があるので)、64ビットシステムの制限ははるかに小さい。

警告

ファイルを開く際に使用する場合 memmap=True Mmapの動作方法のため、これは、HDUデータがアクセスされたとき(すなわち、 hdul[0].data )mmapは、FITSファイルの別のハンドルを開きます。つまり電話が終わった後も hdul.close() Mmapはまだ開いたデータハンドルを持っているため,メモリ内にすべてのデータを持つ.data属性がすべてのデータを持つと仮定して構築された不注意なプログラムにアクセスされることができる.

Mmapを強制的に閉鎖しますので、含まれてお待ちください HDUList オブジェクトが範囲を超えている、または手動で呼び出す del hdul[0].data それがそうです。(データセットへの他の参照が存在しない限り,この操作は有効である).

符号なし整数

FITSフォーマットはFortranに由来するため,FITS自体は画像やテーブル中の符号なし整数データをサポートしていない.しかしながら、シンボルなし整数がシンボル整数として格納される共通の約束がある。 シフトする. 説明(a BZERO 価値のあるキーワード 2 ** (BITPIX - 1) )すべてのシンボルあり整数をシンボルなし整数に移動させる。例えば、値を書き込む際には 0 符号なし32ビット整数としてFITSファイルに格納されている. -32768 Headerキーワード BZERO = 32768 それがそうです。

astropy デフォルトではこの約束が識別され適用されるので,符号なし整数と解釈すべきように見えるすべてのデータは自動的に変換される(これは画像およびテーブルに適用される).はい。 astropy V 1.1.0以前のバージョンこれは not 自動的に適用され、パラメータを伝達する必要があります uint=True 至る open() それがそうです。V 1.1.0以降では、デフォルト設定です。

あっても uint=False vt.的 BZERO Shiftは依然として適用されているが,返される配列は“float 64”タイプである.ズーム/平行移動を完全に無効にするためには、ご利用ください do_not_scale_image_data=True (会いましょう) なぜ整数データを含む画像が意外に浮動小数点数に変換されるのですか? 詳細については,一般的な問題解答を参照されたい).

圧縮ファイルを使用する

注釈

FITSファイルに圧縮HDUを用いたファイルを検討した. Compressed Image Data それがそうです。

♪the open() 関数は、gzip、bzip 2、またはpkzipで圧縮されたFITSファイルをシームレスに開きます。この文脈では、これらのユーティリティのうちの1つを使用して圧縮されたFITSファイル(例えば、.fits.gzファイル)について話していることに留意されたい。

圧縮ファイルを処理する際にはいくつかの制限がある.例えば、複数の圧縮ファイルを含むZipファイルについては、第1のファイルにしかアクセスできない。また,bzip 2はアクセスパターンの追加や更新をサポートしていない.

ファイルを書き込む場合(例えば、使用 writeto() 関数)は、所与のファイル拡張子または書き込まれている予め存在するファイルで使用される圧縮に基づいて圧縮が決定される。

非標準ファイルを使用する

いつ? astropy.io.fits FITS規格を満たしていないFITSファイルを読み込む際には,基準を満たしていないフィールドの教養的な解釈を試みる.これは、常に成功するわけではなく、ヘッダにアクセスする際に警告をトリガするか、またはファイルを書き込む際に例外をトリガする可能性がある。出力ファイルに書き込まれたフィールドの検証は使用可能である output_verify のパラメータです。 open() それがそうです。読み取ったファイルを開くには方法を使って検証·修復することができます HDUList.verify それがそうです。この方法は、一般に、ファイルを開いた後であるが、任意のヘッダまたはデータにアクセスする前に呼び出される:

>>> with fits.open(fits_image_filename) as hdul:
...    hdul.verify('fix')
...    data = hdul[1].data

上の例では、呼び出し hdul.verify("fix") お願いします。 astropy.io.fits ランダムなフィールドを修復し、情報メッセージを印刷する。以下のオプション以外のオプション "fix" FITSの下で記述した 査証.

参考

FITS 査証. それがそうです。

ヘッダに適したものを使います

前述したように、 HDUList HDUオブジェクトです .header そして .data 属性は、HDUのヘッダおよびデータ部分にアクセスするために使用されてもよい。

FITSヘッダに慣れていない人にとっては、キーワード、値、および注釈を含む80バイトの“カード”リストからなる。キーワードおよび注釈は、すべて文字列でなければならず、値は、文字列または整数、浮動小数点数、複数または True/False それがそうです。少数の特殊な場合を除いて、キーワードは一般にタイトルで唯一である。

Header属性は,1つのHeaderインスタンス,もう1つのHeaderインスタンスである. astropy 相手。Headerキーワードに関連付けられた値を取得するためには、以下の操作(La Python Dicts)を実行してください。

>>> hdul = fits.open(fits_image_filename)
>>> hdul[0].header['DATE']
'01/04/99'

キーワード“date”の値を取得し、文字列‘01/04/99’である。

キーワード名はFITSファイルでは常に大文字であるにもかかわらず、指定されたキーワード名を使用する astropy ユーザを容易にするために,大文字を区別しない.指定されたキーワード名が存在しない場合、それは誘発されます KeyError 例外です。

インデックス(Pythonリストのような)でキーワード値を得ることもできます

>>> hdul[0].header[7]
32768.0

本例では、8番目のキーワード(Python listのように、0インデックスの)の値-a Float-32768.0を返します。

同様に,キーワードの値を更新することができる astropy キーワード名またはインデックス:

>>> hdr = hdul[0].header
>>> hdr['targname'] = 'NGC121-a'
>>> hdr[27] = 99

しかし、ほとんどのアプリケーションコードは、それらの位置索によってタイトル値を更新するのではなく、それらのキーワード名によって更新されるべきであることに注意されたい。これは,多くのFITSキーワードがタイトル中の任意の位置に出現する可能性があるためである.

キーワードに関連する値および注釈をタプルとして指定することによって、それらを更新することもできる:

>>> hdr = hdul[0].header
>>> hdr['targname'] = ('NGC121-a', 'the observation target')
>>> hdr['targname']
'NGC121-a'
>>> hdr.comments['targname']
'the observation target'

辞書と同様に、上記の文法を用いて新たなキーワード/値ペアを追加することもできます(注釈付けを選択することもできます)。この場合、新しいカードは、タイトルの末尾に付加される(注釈や履歴などの注釈キーワードでない限り、この場合、キーワードを有する最後のカードの後に付加される)。

既存のカードを更新するか、新しいカードを追加するもう1つの方法は使用です Header.set() 方法:

>>> hdr.set('observer', 'Edwin Hubble')

コメントや履歴の追加方法は、通常のカードと同様であるが、それらの場合、既存の履歴やコメントカードを更新するのではなく、常に新しいカードを作成する:

>>> hdr['history'] = 'I updated this file 2/26/09'
>>> hdr['comment'] = 'Edwin Hubble really knew his stuff'
>>> hdr['comment'] = 'I like using HST observations'
>>> hdr['history']
I updated this file 2/26/09
>>> hdr['comment']
Edwin Hubble really knew his stuff
I like using HST observations

注意:プラカードと通常カードのコメント値を混同しないように注意する.

既存の注釈カードや歴史カードを更新するには、インデックスに従って参照してください。

>>> hdr['history'][0] = 'I updated this file on 2/27/09'
>>> hdr['history']
I updated this file on 2/27/09
>>> hdr['comment'][1] = 'I like using JWST observations'
>>> hdr['comment']
Edwin Hubble really knew his stuff
I like using JWST observations

FITSファイルに表示されているヘッダ全体を見るには(エンドカードやパディングを除く)、ヘッダオブジェクトを個別に入力してください、または print(repr(hdr)) **

>>> hdr  
SIMPLE  =                    T / file does conform to FITS standard
BITPIX  =                   16 / number of bits per data pixel
NAXIS   =                    0 / number of data axes
...
>>> print(repr(hdr))  
SIMPLE  =                    T / file does conform to FITS standard
BITPIX  =                   16 / number of bits per data pixel
NAXIS   =                    0 / number of data axes
...

入力のみ print(hdr) 使用も可能であるが,多くのディスプレイではあまり明瞭ではない可能性があり,FITSファイル自体に書き込まれたヘッダが表示されるため,カード間に改行がないことを意味する.新しいユーザーにとって、これは一般的な困惑の源だ。

タイトルの一部を見ることもできます:

>>> hdr[:2]
SIMPLE  =                    T / file does conform to FITS standard
BITPIX  =                   16 / number of bits per data pixel

上には上位2枚のカードしか表示されていません。

すべてのキーワードのリストを取得するには、ご利用ください Header.keys() あなたがdictを使うような方法:

>>> list(hdr.keys())  
['SIMPLE', 'BITPIX', 'NAXIS', ...]

例えば:

また見られる. 編集配合ヘッダ それがそうです。

構造キーワード

Fitsキーワードは,文書を解析するために必要なファイル構造に関するメタデータとキー情報を混同している.これらは 構造物. キーワードは内部で管理されている astropy.io.fits また,通常はユーザにタッチされるべきではない.逆に使うべきです astropy.io.fits クラス(以下の例を参照)。

FITS規格で使用されている特定の構造キーワード集合はHDUタイプによって異なる.次の表は、各HDUタイプに関連するキーワードを示しています。

構造キーワード

HDUタイプ

構造キーワード

全部

SIMPLE, BITPIX, NAXIS

PrimaryHDU

EXTEND

ImageHDU, TableHDU, BinTableHDU

PCOUNT, GCOUNT

GroupsHDU

NAXIS1, GCOUNT, PCOUNT, GROUPS

TableHDU, BinTableHDU

TFIELDS, TFORM, TBCOL

データスケーリングやテーブルの列属性のための予約キーワードなど、他にも多くの予約キーワードがある FITS Standard それがそうです。そのほとんどは Column HDUオブジェクト、例えば hdu.name 設定します EXTNAME あるいは、あるいは hdu.ver 上の EXTVER それがそうです。共通操作の結果として,構造キーワードが検査および/または更新される.例えば、以下の場合:

  1. データを設定する。♪the NAXIS* キーワードはデータ形状から設定されています (.data.shape )、そして、 BITPIX データタイプから (.data.dtype )。

  2. タイトルを設定する。そのキーワードはデータ属性(上記のように)によって更新される.

  3. 書類を書いています。すべての必要なキーワードは、タイトルに削除、更新、または追加されます。

  4. HDUの検証方法を呼び出す(例えば、 PrimaryHDU.verify() )である。一部のキーワードは自動的に修復できる。

これらの場合、ユーザがこれらのキーワードに割り当てることができる任意の手書き値が上書きされる。

画像データを使って

HDUのデータが画像である場合、HDUオブジェクトのデータ属性が返される numpy ndarray 相手。ご参照ください numpy これらの数値配列を操作する詳細については,文書を参照されたい.

>>> data = hdul[1].data

ここでは data 第2のHDUのデータオブジェクト(第1のHDU、 hdul[0] メインHDU)であり、‘SCI’拡張に対応する。代替的に、拡張は、拡張子(EXTNAMEキーワードで指定された)によってアクセスすることができます:

>>> data = hdul['SCI'].data

同じEXTNAMEを有する拡張子が複数ある場合、EXTVER値は、EXTNAMEと共にタプルとして指定される必要がある。

>>> data = hdul['sci',2].data

EXTNAMEも大文字と小文字を区別していないことに注意してください。

帰還者. numpy オブジェクトには、例えば、配列に関する情報を取得するための多くの属性および方法がある。

>>> data.shape
(40, 40)
>>> data.dtype.name
'int16'

画像データは numpy オブジェクトは,それをスライスし,見て数学的演算を行うことができる.X=5、y=2における画素値を見る:

>>> print(data[1, 4])
348

PythonはC(Fortranとは異なる)と同様に0インデックスであり,インデックスの軸が最も遅く,最も変化の速い軸が後であること,すなわち,2 D画像に対してFITS NAXIS 1キーワードに対応する高速軸(X軸)が2番目のインデックスであることに注意されたい.同様に、Pythonでは、x=11~20(含む)およびy=31~40(含む)の1索リードセグメントは、以下のように与えられる。

>>> data[30:40, 10:20]
array([[350, 349, 349, 348, 349, 348, 349, 347, 350, 348],
       [348, 348, 348, 349, 348, 349, 347, 348, 348, 349],
       [348, 348, 347, 349, 348, 348, 349, 349, 349, 349],
       [349, 348, 349, 349, 350, 349, 349, 347, 348, 348],
       [348, 348, 348, 348, 349, 348, 350, 349, 348, 349],
       [348, 347, 349, 349, 350, 348, 349, 348, 349, 347],
       [347, 348, 347, 348, 349, 349, 350, 349, 348, 348],
       [349, 349, 350, 348, 350, 347, 349, 349, 349, 348],
       [349, 348, 348, 348, 348, 348, 349, 347, 349, 348],
       [349, 349, 349, 348, 350, 349, 349, 350, 348, 350]], dtype=int16)

画素または子節の値を更新するには、以下の操作を実行してください。

>>> data[30:40, 10:20] = data[1, 4] = 999

この例はピクセルを変更しました[1, 4] 小節と[三十時四十分、十時二十分] 999までの新しい値ですご参照ください Numpy documentation Pythonパターンの配列インデックスおよびスライスに関するより詳細な情報。

配列動作の次の例は、画像データをカウントからフラックスに変換することである。

>>> photflam = hdul[1].header['photflam']
>>> exptime = hdr['exptime']
>>> data = data * photflam / exptime
>>> hdul.close()

なお、このような操作を画像全体で実行するには、画像全体をメモリに保存する必要がある。この例は定位置乗算を行うため、コピーは作成されないが、元の画像はまずメインメモリに入れることができる必要がある。ほとんどの人にとって、これは現代のパソコンでは問題ではないはずだ。

このとき行われたすべての変更を保留して新しいファイルに書き込む場合には、使用することができます HDUList.writeto() 方法(以下参照)。

例えば:

また見られる. FITSファイルから画像を読み出して印刷する それがそうです。

表データを使用する

メソッドFITS形式のフォームデータを読み出して書き込む. fits 直接包んでください。しかし場合によっては上層部は 統一ファイル読み書きインタフェース 普通は十分で、ある程度もっと使いやすい。ご参照ください Unified I/O FITS 詳しい情報を部分的に知っています。

画像と同様に,FITテーブルの拡張されたデータ部分は .data 属性::

>>> fits_table_filename = fits.util.get_testdata_filepath('tb.fits')
>>> hdul = fits.open(fits_table_filename)
>>> data = hdul[1].data # assuming the first extension is a table

もしあなたがよく知っているなら numpy recarray (レコード配列)オブジェクトは、表データが実質的にいくつかの追加属性を有するレコード配列であることがわかります。ただし,レコード配列を熟知することは本マニュアルの前提条件ではない.

表の1行目を見るには、以下の操作を実行してください。

>>> print(data[0])
(1, 'abc', 3.7000000715255736, False)

表の各行は一つです FITS_record オブジェクトは、オブジェクトのように見える異種データタイプ要素を含む(Python)タプル。本例では,整数,文字列,浮動小数点数,ブール値である.したがって,表データはこのようなレコードの配列のみである.より一般的な場合、ユーザは列的にデータにアクセスすることができる。これは使用することで field() 方法です。表の最初の列(またはNumPy用語の“field”--ここで“column”と交換して使用される)を取得するためには、以下のように使用してください。

>>> data.field(0)
array([1, 2]...)

A numpy 指定されたフィールドを有するデータタイプを返す。

見出しキーワードと同様に、列はインデックスで参照されてもよく(上述したように)、名前順に参照されてもよい:

>>> data.field('c1')
array([1, 2]...)

名前別に列にアクセスする場合には、辞書のようなアクセスも可能である(さらに好ましくは):

>>> data['c1']
array([1, 2]...)

多くの場合、列名は、テーブルにおける物理的順序とは完全に独立しているので、列の名前で列にアクセスすることが望ましい。見出しキーワードと同様に,列名は大文字と区別しない.

しかしどうやって表にどのような列があるのかわかりますか?まず、表HDUのもう一つの属性をご紹介します。 columns 属性::

>>> cols = hdul[1].columns

この属性は ColDefs (列定義)オブジェクト.もし私たちが ColDefs.info() 方法インタラクションプロンプトから:

>>> cols.info()
name:
    ['c1', 'c2', 'c3', 'c4']
format:
    ['1J', '3A', '1E', '1L']
unit:
    ['', '', '', '']
null:
    [-2147483647, '', '', '']
bscale:
    ['', '', 3, '']
bzero:
    ['', '', 0.4, '']
disp:
    ['I11', 'A3', 'G15.7', 'L6']
start:
    ['', '', '', '']
dim:
    ['', '', '', '']
coord_type:
    ['', '', '', '']
coord_unit:
    ['', '', '', '']
coord_ref_point:
    ['', '', '', '']
coord_ref_value:
    ['', '', '', '']
coord_inc:
    ['', '', '', '']
time_ref_pos:
    ['', '', '', '']

これは、テーブル内のすべての列の属性、例えば、それらの名前、フォーマット、小数点目盛り、ゼロビットなどを表示し、スクリプトでは、以下のコマンドを使用して、列名およびそのフォーマットの同様の出力を印刷表示することができる。

>>> hdul[1].columns
ColDefs(
    name = 'c1'; format = '1J'; null = -2147483647; disp = 'I11'
    name = 'c2'; format = '3A'; disp = 'A3'
    name = 'c3'; format = '1E'; bscale = 3; bzero = 0.4; disp = 'G15.7'
    name = 'c4'; format = '1L'; disp = 'L6'
)

これらの属性を個別に取得することもできます例えば:

>>> cols.names
['c1', 'c2', 'c3', 'c4']

フィールド名の(Python)リストを返します。

各フィールドは numpy 対象者は武器庫全体を持っています numpy 使う道具です。値を再割り当て(更新)することができます:

>>> data['c4'][:] = 0

1列の平均値をとります:

>>> data['c3'].mean()  
5.19999989271164

これを類推する.

ファイルの変更を保存する

前述したように、ユーザがファイルを開き、タイトルやデータをいくつか変更した後、ユーザは使用することができる HDUList.writeto() 変更を保存するためには、以下の操作を実行してください。これにより,メモリ中のヘッダとデータのバージョンを取得し,ディスク上の新しいFITSファイルに書き込む.元のデータを(より多くの)メモリに再コピーすることなく、メモリ内のデータに対して後続の動作を実行し、別の異なるファイルに書き込むことができる:

hdul.writeto('newtable.fits')

現在の内容を hdulist 新しいディスクファイルnewfile.fitsに追加します。ファイルが更新モードで開いている場合は HDUList.flush() 方法はすべての変更を書くこともできます open() 元のファイルに戻ります。♪the close() 方法は、更新モードで開いたFITSファイルに対して同様の動作を行う。

with fits.open('original.fits', mode='update') as hdul:
    # Change something in hdul.
    hdul.flush()  # changes are written back to original.fits

# closing the file will also flush any changes and prevent further writing

新しい協力ファイルを作成する

新しい画像ファイルの作成

これまでに,既存のFITSファイルをどのように読み出して更新するかを示してきた.でも最初から新しいFITSファイルを作成するのはどうですか?このような任務は astropy 画像HDUに使います。まず、メインHDUと画像データのみを含むFITSファイルの作成方法をお見せします。

まず私たちは numpy データ部分のオブジェクト::

>>> import numpy as np
>>> n = np.arange(100.0) # a simple sequence of floats from 0.0 to 99.9

次に私たちは PrimaryHDU オブジェクトはデータをカプセル化する::

>>> hdu = fits.PrimaryHDU(n)

そして私たちは HDUList 新たに作成されたプライマリHDUを含めて新しいファイルを書き込むには、以下の操作を実行してください。

>>> hdul = fits.HDUList([hdu])
>>> hdul.writeto('new1.fits')

そうなんだ!実際には astropy さらに、最後の2行に同じ動作を実現するための迅速な方法を提供する:

>>> hdu.writeto('new2.fits')

これは、手動でカプセル化することなく、単一のHDUをFITSファイルに書き込むことができます。 HDUList 対象を優先する。

新しいフォームファイルの作成

注釈

もし作成するには バイナリ. 他のハードディスクがないテーブルに適していますので、ご利用いただけます Table 代わりに、適切に書かれています。これは“下位レベル”よりもインタフェースに適しているよりもはるかに簡単である:

>>> from astropy.table import Table
>>> t = Table([[1, 2], [4, 5], [7, 8]], names=('a', 'b', 'c'))
>>> t.write('table1.fits', format='fits')

以下のコードを用いた等価コード astropy.io.fits 以下に示す.

>>> from astropy.io import fits
>>> import numpy as np
>>> c1 = fits.Column(name='a', array=np.array([1, 2]), format='K')
>>> c2 = fits.Column(name='b', array=np.array([4, 5]), format='K')
>>> c3 = fits.Column(name='c', array=np.array([7, 8]), format='K')
>>> t = fits.BinTableHDU.from_columns([c1, c2, c3])
>>> t.writeto('table2.fits')

テーブルの構造は、テーブルの構造がより多くの情報を必要とするので、テーブルHDUを作成することは、ミラーHDUよりも少し複雑です。まず、テーブルは拡張HDUのみであり、メインHDUではありません。ASCIIとBINARYの2種類のFITテーブル拡張がありますここではバイナリテーブルの例を用いる.

最初から表を作るためには、まず列を定義する必要があります。方法は構造です。 Column 対象とそのデータ。2つの列があり、1列目は文字列を含み、2列目は浮動小数点数を含むと仮定します。

>>> import numpy as np
>>> a1 = np.array(['NGC1001', 'NGC1002', 'NGC1003'])
>>> a2 = np.array([11.1, 12.3, 15.2])
>>> col1 = fits.Column(name='target', format='20A', array=a1)
>>> col2 = fits.Column(name='V_mag', format='E', array=a2)

注釈

作成する必要はありません Column もしデータが structured array それがそうです。

次に作成したのは ColDefs (列定義)すべての列のオブジェクト::

>>> cols = fits.ColDefs([col1, col2])

新しいバイナリテーブルHDUオブジェクトを作成します方法は使用されています BinTableHDU.from_columns() 機能::

>>> hdu = fits.BinTableHDU.from_columns(cols)

この関数は(本例では)1つ戻る BinTableHDU それがそうです。

FITSテーブルを表すためのデータ構造を呼ぶ. FITS_rec 派生しています numpy.recarray インターフェースです。新しいテーブルHDUが作成されると、各列アレイは1つに組み合わされる。 FITS_rec 配列しています

作成することができます BinTableHDU より簡潔で、各列のための中間変数を作成する必要もなく、手動で作成する必要もありません ColDefs 対象::

>>> hdu = fits.BinTableHDU.from_columns(
...     [fits.Column(name='target', format='20A', array=a1),
...      fits.Column(name='V_mag', format='E', array=a2)])

ここで、この新しいテーブルHDUを以下のようにFITSファイルに直接書き込むことができます。

>>> hdu.writeto('table3.fits')

このショートカットでは、データのない最小マスタHDUを自動的に作成し、テーブルHDUに追加して効率的なFITSファイルを作成します。マスターHDUの他のデータまたはタイトルキーワードが必要な場合は、まだ作成できます PrimaryHDU オブジェクト、そして使用 HDUList 以下の節で述べる.

複数の拡張子を有するファイルの作成

前の例では、単一の有意な拡張子(A)を作成した PrimaryHDU あるいは…。 BinTableHDU )である。複数の拡張子を有するファイルを作成するためには、拡張HDUを作成し、それらを追加する必要があります HDUList それがそうです。

まず、画像拡張子のためのデータを作成します。

>>> import numpy as np
>>> n = np.ones((3, 3))
>>> n2 = np.ones((100, 100))
>>> n3 = np.ones((10, 10, 10))

異なる拡張子のデータ形状は同じである必要はないことに注意されたい。次に,データを別々のものに入れる PrimaryHDU そして ImageHDU 対象::

>>> primary_hdu = fits.PrimaryHDU(n)
>>> image_hdu = fits.ImageHDU(n2)
>>> image_hdu2 = fits.ImageHDU(n3)

マルチ拡張FITファイルは、画像やフォームデータのみに限定されるものではなく、それらを混合することができる。この点を説明するために,前節の例を用いて作成する BinTableHDU **

>>> c1 = fits.Column(name='a', array=np.array([1, 2]), format='K')
>>> c2 = fits.Column(name='b', array=np.array([4, 5]), format='K')
>>> c3 = fits.Column(name='c', array=np.array([7, 8]), format='K')
>>> table_hdu = fits.BinTableHDU.from_columns([c1, c2, c3])

さて私たちが作ると HDUList 含まれるすべての拡張子をリストします:

>>> hdul = fits.HDUList([primary_hdu, image_hdu, table_hdu])

なぜなら HDUList 行動は1つのようなものです list 例えば追加することもできます ImageHDU 既存のものに追加します HDUList **

>>> hdul.append(image_hdu2)

複数の内線. HDUList 1つだけのように PrimaryHDU そのため、このファイルを保存しますので、ご利用ください HDUList.writeto() 以上のとおりである.

注釈

FITS規格はすべてのファイルが1つしかないことを強制しています PrimaryHDU これはファイルに現れる最初のHDUです。この基準は呼び出しています HDUList.writeto() 満たさなければ,誤りを引き起こす.ご参照ください output_verify オプション. HDUList.writeto() このような警告を修復または無視する方法を理解する。

前の例では PrimaryHDU 実データを含む。場合によっては最低限の PrimaryHDU 基本ヘッダ情報のみを有する.この操作を実行するためには、まず新しいものを作成してください Header オブジェクトパッケージは、メインHDUに含まれる任意のキーワードを使用して、前のように作成されます。 PrimaryHDU **

>>> hdr = fits.Header()
>>> hdr['OBSERVER'] = 'Edwin Hubble'
>>> hdr['COMMENT'] = "Here's some commentary about this FITS file."
>>> empty_primary = fits.PrimaryHDU(header=hdr)

上の例に示すように、カスタムヘッダを使用して新しいプライマリHDUを作成すると、これは、任意の他のヘッダキーワードを自動的に含むことになる。 必要なのは FITS形式(キーワード、例えば SIMPLE そして NAXIS 例えば)。一般に,ユーザはこのようなキーワードを手動で管理すべきではなく,観察に特化した情報キーワードのみを作成し修正すべきである.

次に、マスターHDUおよび任意の他の必要なHDUを含むHDUListを作成します:

>>> hdul = fits.HDUList([empty_primary, image_hdu2, table_hdu])

例えば:

また見られる. マルチ拡張フィッティング(MEF)ファイルを最初から作成します それがそうです。

便利関数.

astropy.io.fits いくつかの高度(“便利”)機能も提供されている。このような便利な機能は,1つのタスクを実現する“缶詰”操作である.これらの“便利”機能を使用することによって、ユーザは、ファイルをオンまたはオフにすることを心配する必要はなく、すべての内務管理は暗黙的に行われる。

警告

これらの関数は、インタラクティブなPythonセッションやあまり複雑ではない解析スクリプトに有用ですが、非常に効率が悪いため、アプリケーションコードに使用すべきではありません。たとえば,呼び出しごとに getval() FITSファイル全体を再解析する必要がある.これらの関数を繰り返し使用するコードは使用に変更すべきである open() データ構造に直接アクセスします

これらの関数の最初の1つは getheader() HDUのヘッダを取得する。以下は、タイトル取得のいくつかの例である。この関数はファイル名のみが必要である.残りのパラメータはオプションであり、ユーザがアクセスするHDUを柔軟に指定することができる:

>>> from astropy.io.fits import getheader
>>> hdr = getheader(fits_image_filename)  # get default HDU (=0), i.e. primary HDU's header
>>> hdr = getheader(fits_image_filename, 0)  # get primary HDU's header
>>> hdr = getheader(fits_image_filename, 2)  # the second extension
>>> hdr = getheader(fits_image_filename, 'sci')  # the first HDU with EXTNAME='SCI'
>>> hdr = getheader(fits_image_filename, 'sci', 2)  # HDU with EXTNAME='SCI' and EXTVER=2
>>> hdr = getheader(fits_image_filename, ('sci', 2))  # use a tuple to do the same
>>> hdr = getheader(fits_image_filename, ext=2)  # the second extension
>>> hdr = getheader(fits_image_filename, extname='sci')  # first HDU with EXTNAME='SCI'
>>> hdr = getheader(fits_image_filename, extname='sci', extver=2)

不明確な規範は異常を引き起こす:

>>> getheader(fits_image_filename, ext=('sci', 1), extname='err', extver=2)
Traceback (most recent call last):
    ...
TypeError: Redundant/conflicting extension arguments(s): ...

タイトルを取得した後、キーワード値を取得して修正するなど、その中の情報にアクセスすることができます:

>>> fits_image_2_filename = fits.util.get_testdata_filepath('o4sp040b0_raw.fits')
>>> hdr = getheader(fits_image_2_filename, 0)    # get primary hdu's header
>>> filter = hdr['filter']                       # get the value of the keyword "filter'
>>> val = hdr[10]                                # get the 11th keyword's value
>>> hdr['filter'] = 'FW555'                      # change the keyword value

タイトルキーワードについては、タイトルは辞書のようであり、リストのようでもある。ユーザは,本章で前述したように,名前または数字インデックスでキーワードにアクセスすることができる.

ユーザがキーワードを1つ読むだけであれば getval() 関数は、上の例に示す2回ではなく、1回のみの呼び出しにさらに簡略化することができる。

>>> from astropy.io.fits import getval
>>> # get 0th extension's keyword FILTER's value
>>> flt = getval(fits_image_2_filename, 'filter', 0)
>>> flt
'Clear'

>>> # get the 2nd sci extension's 11th keyword's value
>>> val = getval(fits_image_2_filename, 10, 'sci', 2)
>>> val
False

機能 getdata() HDUのデータを取得する。似たような getheader() これは,FITSファイル名を入力するだけでよく,拡張子はオプションパラメータで指定される.それは確かに追加のオプションのパラメータヘッダを持っている。HeaderがTrueに設定されていれば,この関数はDataとHeaderを同時に返し,そうでなければData:のみを返す:

>>> from astropy.io.fits import getdata
>>> # get 3rd sci extension's data:
>>> data = getdata(fits_image_filename, 'sci', 3)
>>> # get 1st extension's data AND header:
>>> data, hdr = getdata(fits_image_filename, 1, header=True)

上で紹介した関数を読むために使います。次のいくつかの関数は、以下のコードを作成する便利な関数を示す。

>>> fits.writeto('out.fits', data, hdr)

♪the writeto() 関数は、提供されたデータおよびオプションのヘッダを使用して出力FITSファイルを書き込む。

>>> fits.append('out.fits', data, hdr)

♪the append() 関数は、提供されたデータおよび任意のヘッダを使用して既存のFITSファイルに付加する。指定された出力ファイルが存在しない場合、それは1つを作成します。

from astropy.io.fits import update
update(filename, dat, hdr, 'sci')         # update the 'sci' extension
update(filename, dat, 3)                  # update the 3rd extension
update(filename, dat, hdr, 3)             # update the 3rd extension
update(filename, dat, 'sci', 2)           # update the 2nd SCI extension
update(filename, dat, 3, header=hdr)      # update the 3rd extension
update(filename, dat, header=hdr, ext=5)  # update the 5th extension

♪the update() 関数は,指定された拡張子を入力データ/ヘッダ更新を用いて更新する.第3のパラメータは、データに関連するヘッダとすることができる。第3のパラメータがヘッダでない場合、それ(および他の位置パラメータ)が拡張仕様であると仮定する。ヘッダおよび拡張仕様は、キーワードパラメータであってもよい。

♪the printdiff() 関数は、タイトルおよびデータを含む2つのFITファイルの差異報告を印刷する。最初の2つのパラメータは、2つのFITファイル名または一致データタイプのFITファイルオブジェクトでなければならない(すなわち、文字列を使用してファイル名が指定されている場合、両方の入力は文字列でなければならない)。第3のパラメータは、任意の拡張仕様であり、同じ呼び出しフォーマットを有する getheader() そして getdata() それがそうです。また、追加することもできます FITSDiff 級友たち。

from astropy.io.fits import printdiff
# get a difference report of ext 2 of inA and inB
printdiff('inA.fits', 'inB.fits', ext=2)
# ignore HISTORY and COMMMENT keywords
printdiff('inA.fits', 'inB.fits', ignore_keywords=('HISTORY','COMMENT')

最後に、 info() 関数は、FITSファイルを指定する情報を印刷する:

>>> fits.info(fits_image_filename)
Filename: ...test0.fits
No.    Name      Ver    Type      Cards   Dimensions   Format
  0  PRIMARY       1 PrimaryHDU     138   ()
  1  SCI           1 ImageHDU        61   (40, 40)   int16
  2  SCI           2 ImageHDU        61   (40, 40)   int16
  3  SCI           3 ImageHDU        61   (40, 40)   int16
  4  SCI           4 ImageHDU        61   (40, 40)   int16

これは、任意の詳細を見ることなく、所与のファイルに含まれるコンテンツの概要を得ることができる最も有用な便利な関数のうちの1つである。

Vbl.使用 astropy.io.fits

命令行ユーティリティ

便宜上いくつか astropy サブパッケージは、お客様のシステムにユーティリティをインストールし、Pythonインタプリタを開くことなく一般的なタスクを実行することができます。これらのユーティリティには、

  • fitsheader :FITSファイルのタイトルを印刷します。

  • fitscheck :FITSファイルを書き換えるCHECKSUMおよびDATASUMキーワードを検証して選択します。

  • FitsDiff :2つのFITファイルを比較し、差異を報告します。

  • スクリプト :スケーリングおよび伸張を含む適切な画像をビットマップに変換する。

  • wcslint :検査 WCS 標準に適合するFITSファイルのキーワード。

その他の情報

性能提示

データ配列を PrimaryHDU そして ImageHDU 1つまで dask 配列していますこれをディスクに書き込むと,書き込み時にDaskアレイが計算され,過剰なメモリの使用は回避される:

>>> import dask.array as da
>>> array = da.random.random((1000, 1000))
>>> from astropy.io import fits
>>> hdu = fits.PrimaryHDU(data=array)
>>> hdu.writeto('test_dask.fits')

参照/API

読み書きパッケージはファイルに適しており,その内容を操作する.

柔軟な画像伝送システム(FITS)ファイルを読み書きするためのモジュール。このファイルフォーマットは1999年に国際天文学連合会の認可を受け、米国航空宇宙局によって高エネルギー天体物理データを格納する標準フォーマットとして許可された。FITS規格の詳細については,NASA/科学オフィス標準と技術出版物,NOST 100−2.0を参照されたい。

脚注

1

すでにPyFITSに依存しているレガシーコードに対してのみ,“from asterpy.io import Fits as pyfit”を使い続けることは受け入れられる.