表データ

本章では,表HDUにおけるデータコンポーネントについて議論する.テーブルは、主HDUに位置することなく、常に拡張HDU内に位置するであろう。

FITS標準にはバイナリテーブルとASCIIテーブルの2種類のテーブルがある.バイナリテーブルは記憶面でより経済的であり、データアクセスおよび操作の面でより速い。ASCII表は“人間可読”の形でデータを格納しているため,より多くの記憶空間とより多くの処理時間を占めており,ASCIIテキストを数値に解析する必要があるためである.

注釈

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

記録配列としての表データ

記録アレイとは何ですか。

レコード配列は,異種データタイプを含むレコード(すなわち行)の配列である.レコード配列は,NumPyライブラリ内の記録モジュールによって得ることができる.

以下は、記録配列の一例である。

>>> import numpy as np
>>> bright = np.rec.array([(1,'Sirius', -1.45, 'A1V'),
...                        (2,'Canopus', -0.73, 'F0Ib'),
...                        (3,'Rigil Kent', -0.1, 'G2V')],
...                       formats='int16,a20,float32,a10',
...                       names='order,name,mag,Sp')

本例では、3つのレコード(行)および4つのフィールド(列)がある。第1のフィールドは短整数型であり、第2のフィールドは文字列(長さ20)であり、第3のフィールドは浮動小数点数であり、第4のフィールドは文字列(長さ10)である。各レコードは同じ(異種)データ構造を持つ.

FITSテーブル用の下位データ構造は FITS_rec これは専門家です numpy.recarray それがそうです。A FITS_rec 上記の例で通常の重配列に提供されたのと同じ初期化フォーマットを使用して直接インスタンス化することができる。新しいものをインスタンス化することもできます FITS_rec 一連のものから astropy.io.fits.Column 対象使用 FITS_rec.from_columns() 種類の方法。その意味は BinTableHDU.from_columns() そして TableHDU.from_columns() ただし、HDUオブジェクト全体ではなく、実際のFits_rec配列のみを返す。

表のメタデータ

FITS表HDU中のデータは基本的に属性を付加したレコード配列である.メタデータ(すなわち、テーブルデータに関する情報)は、ヘッダに格納される。例えば、キーワードTFORM 1は、第1のフィールドのフォーマットを含み、TTYPE 2は、第2のフィールドの名前を含むなど、NAXIS 2はレコード(行)の数を与え、TFIELDSは、フィールド(列)の数を与える。FITS表に対して,最大フィールド数は999である.TFormで指定されたデータタイプは,バイナリテーブルのアルファベットコードとASCIIテーブルのFortranに類似したフォーマット文字列で表される.これは,配列を記録する際のフォーマット仕様とは異なることに注意されたい.

FITS表を読む

画像のように .data 表HDUの属性は表のデータを含む.

例を引く

FITSテーブルを読み込むには、以下の操作を実行してください。

>>> from astropy.io import fits
>>> fits_table_filename = fits.util.get_testdata_filepath('btable.fits')

>>> hdul = fits.open(fits_table_filename)  # open a FITS file
>>> data = hdul[1].data  # assume the first extension is a table
>>> # show the first two rows
>>> first_two_rows = data[:2]
>>> first_two_rows  
[(1, 'Sirius', -1.45000005, 'A1V') (2, 'Canopus', -0.73000002, 'F0Ib')]
>>> # show the values in field "mag"
>>> magnitudes = data['mag']
>>> magnitudes  
array([-1.45000005, -0.73000002, -0.1       ], dtype=float32)
>>> # columns can be referenced by index too
>>> names = data.field(1)
>>> names.tolist() 
['Sirius', 'Canopus', 'Rigil Kent']
>>> hdul.close()

注意してください、はい astropy 使用する際には field() メソッドの場合は0インデックスであり,ヘッダキーワード(例えばTForm)の接尾辞は1インデックスである.だからね、 data.field(0) 列中のデータは、その名前がTTYPE 1で指定され、フォーマットがTFORM 1で指定される。

警告

FITSフォーマットは、例えば、ゼロ幅データフォーマットのテーブル列を使用することを可能にする。 '0D' それがそうです。これは,その列にデータが含まれていないファイル上で空間を節約するためである可能性がある.このようなファイルでは,表データにアクセスする際にゼロ幅列を省略するため,使用している. field() 方法です。したがって、ゼロ幅列を含むファイルに遭遇したい場合は、インデックスではなく名前でフィールドにアクセスすることをお勧めします。

表操作

選択表の記録

画像データと同様に、同じ“マスク配列”思想を使用してテーブルから必要なレコードを選択し、その中から新しいテーブルを作成することができる。

実例.

テーブルの第2のフィールドの名前が‘MALITUTE’であると仮定すると、入力テーブル内のすべての振幅>−0.5のレコードを含む出力テーブルが生成される。

>>> with fits.open(fits_table_filename) as hdul:
...     data = hdul[1].data
...     mask = data['mag'] > -0.5
...     newdata = data[mask]
...     hdu = fits.BinTableHDU(data=newdata)
...     hdu.writeto('newtable.fits')

HDUオブジェクトのデータをその場で更新することもできます:

>>> with fits.open(fits_table_filename) as hdul:
...     hdu = hdul[1]
...     mask = hdu.data['mag'] > -0.5
...     hdu.data = hdu.data[mask]
...     hdu.writeto('newtable2.fits')

いま表を併合している

中合では違う時計はとても便利です astropy それがそうです。

実例.

入力テーブルの列定義をマージするには、以下の操作を実行してください。

>>> fits_other_table_filename = fits.util.get_testdata_filepath('table.fits')

>>> with fits.open(fits_table_filename) as hdul1:
...     with fits.open(fits_other_table_filename) as hdul2:
...         new_columns = hdul1[1].columns + hdul2[1].columns
...         new_hdu = fits.BinTableHDU.from_columns(new_columns)
>>> new_columns
ColDefs(
        name = 'order'; format = 'I'
        name = 'name'; format = '20A'
        name = 'mag'; format = 'E'
        name = 'Sp'; format = '10A'
        name = 'target'; format = '20A'
        name = 'V_mag'; format = 'E'
    )

出力テーブル中のフィールド数は,入力テーブルのフィールド数の和となる.ユーザは、入力テーブルが公共フィールド名を共有しないことを保証しなければならない。出力テーブル中のレコード数は,すべての入力テーブルにおける最大レコード数となる.本来短いテーブルの拡張スロットはゼロ(または空白)となる.

この例の別のバージョンを使用して、新しい列をテーブルに追加することができる。新しい列を使用して既存のテーブルを更新することは、通常、その価値よりも難しいですが、既存のテーブルの列に新しい列を加えた新しいテーブルを作成することで、リストをテーブルに“追加”することができます。

>>> with fits.open(fits_table_filename) as hdul:
...     orig_table = hdul[1].data
...     orig_cols = orig_table.columns
>>> new_cols = fits.ColDefs([
...     fits.Column(name='NEWCOL1', format='D',
...                 array=np.zeros(len(orig_table))),
...     fits.Column(name='NEWCOL2', format='D',
...                 array=np.zeros(len(orig_table)))])
>>> hdu = fits.BinTableHDU.from_columns(orig_cols + new_cols)

newtable.fits 原始表を持つ新しい表と、ゼロで充填された2つの新しい列が含まれています。

表を追加する

この2つのテーブルは、異なるフィールド属性を有する可能性があるので、1つのテーブルを別のテーブルに追加するのはやや複雑である。

実例.

ここで、第1の例はフィールドインデックスで追加され、第2の例はフィールド名で追加される。この2つの場合,出力表はいずれも列属性(名前,フォーマットなど)を継承する.最初の表の:

>>> with fits.open(fits_table_filename) as hdul1:
...     with fits.open(fits_table_filename) as hdul2:
...         nrows1 = hdul1[1].data.shape[0]
...         nrows2 = hdul2[1].data.shape[0]
...         nrows = nrows1 + nrows2
...         hdu = fits.BinTableHDU.from_columns(hdul1[1].columns, nrows=nrows)
...         for colname in hdul1[1].columns.names:
...             hdu.data[colname][nrows1:] = hdul2[1].data[colname]

表のズームデータ

画像と同様に,表フィールドのデータもスケーリング可能である.テーブル内のズームは、画像内のスケーリングよりも広い意味を持っています。画像において、物理データは、格納データの単純な線形変換である。表フィールドには、BSCALEおよびBZEROがTSCANnおよびTZEROnとしてヘッダに格納される構造もある。また,ブール列とASCII表の数値フィールドも汎用的な“スケーリング”フィールドであるが,TSCARやTZEROはない.

画像の場合のようなスケーリングされたすべてのフィールドは、追加のメモリ空間および処理を占有します。したがって、高性能が必要な場合は、スケーリングフィールドの使用をできるだけ少なくしてください。

すべてのスケーリングはユーザのために行われるため,ユーザは物理データしか見ることができない.したがって、物理列値と記憶列値との間を往復スケーリングする心配はない。

配合表の作成

列作成.

最初から表を作成するためには,まず単独の列を作成する必要がある.A Column 構造関数は最も少ない列名とフォーマット情報のみを必要とする.以下は、バイナリテーブルによって許可されるすべてのフォーマットの概要である。

FITS format code         Description                     8-bit bytes

L                        logical (Boolean)               1
X                        bit                             *
B                        Unsigned byte                   1
I                        16-bit integer                  2
J                        32-bit integer                  4
K                        64-bit integer                  8
A                        character                       1
E                        single precision float (32-bit) 4
D                        double precision float (64-bit) 8
C                        single precision complex        8
M                        double precision complex        16
P                        array descriptor                8
Q                        array descriptor                16

本章では,バイナリ表に焦点を当てる.ASCII表は後述する.あまり一般的でないXフォーマット(ビット配列)およびPフォーマット(可変長テーブルのための)も後述する。

構造を除いて Column 列を作成するために使用することができるオプションのパラメータが多くある。以下は、これらのパラメータとそれに対応するタイトルキーワードと説明のリストである。

Argument        Corresponding         Description
in Column()     header keyword

name            TTYPE                 column name
format          TFORM                 column format
unit            TUNIT                 unit
null            TNULL                 null value (only for B, I, and J)
bscale          TSCAL                 scaling factor for data
bzero           TZERO                 zero point for data scaling
disp            TDISP                 display format
dim             TDIM                  multi-dimensional array spec
start           TBCOL                 starting position for ASCII table
coord_type      TCTYP                 coordinate/axis type
coord_unit      TCUNI                 coordinate/axis unit
coord_ref_point TCRPX                 pixel coordinate of the reference point
coord_ref_value TCRVL                 coordinate value at reference point
coord_inc       TCDLT                 coordinate increment at reference point
time_ref_pos    TRPOS                 reference position for a time coordinate column
ascii                                 specifies a column for an ASCII table
array                                 the data of the column

実例.

以下は、様々なオプションパラメータの組み合わせを使用したいくつかの列である。

>>> counts = np.array([312, 334, 308, 317])
>>> names = np.array(['NGC1', 'NGC2', 'NGC3', 'NGC4'])
>>> values = np.arange(2*2*4).reshape(4, 2, 2)
>>> col1 = fits.Column(name='target', format='10A', array=names)
>>> col2 = fits.Column(name='counts', format='J', unit='DN', array=counts)
>>> col3 = fits.Column(name='notes', format='A10')
>>> col4 = fits.Column(name='spectrum', format='10E')
>>> col5 = fits.Column(name='flag', format='L', array=[True, False, True, True])
>>> col6 = fits.Column(name='intarray', format='4I', dim='(2, 2)', array=values)

本例では,FITSアルファベットコードを用いてフォーマットを指定する.(数値型)アルファベットコードの前に数字(>1)がある場合,そのフィールド中の各セルが1次元配列であることを表す.列“COL 4”の場合,各セルは10個の要素からなる配列(NumPy配列)である.列“coll 6”の場合,“dim”パラメータを用いることにより,各セルは2 x 2要素の多次元配列である.

文字列フィールドの場合、数字は left バイナリテーブルを作成する際には“A”という文字が使用され、そうであるべきである そうだそうだ ASCIIテーブルを作成する際。しかしながら、一般的な混同であるため、バイナリテーブルを作成する際には、両方のフォーマットが理解可能である(ただし、ファイルを書き込む際には、正しいフォーマットがヘッダに書き込まれることに留意されたい)。したがって,列“coll 1”と“coll 3”に対して,それらの各セルには10文字がある.デジタルデータタイプの場合、次元番号は、後ではなく、アルファベットコードの前になければならない。

柱の構造が完成すると BinTableHDU.from_columns() クラス方法は、テーブルHDUを構築するために使用することができる。列定義オブジェクトを閲覧することができます:

>>> coldefs = fits.ColDefs([col1, col2, col3, col4, col5, col6])
>>> hdu = fits.BinTableHDU.from_columns(coldefs)
>>> coldefs
ColDefs(
    name = 'target'; format = '10A'
    name = 'counts'; format = 'J'; unit = 'DN'
    name = 'notes'; format = '10A'
    name = 'spectrum'; format = '10E'
    name = 'flag'; format = 'L'
    name = 'intarray'; format = '4I'; dim = '(2, 2)'
)

直接使うか BinTableHDU.from_columns() 方法:

>>> hdu = fits.BinTableHDU.from_columns([col1, col2, col3, col4, col5, col6])
>>> hdu.columns
ColDefs(
    name = 'target'; format = '10A'
    name = 'counts'; format = 'J'; unit = 'DN'
    name = 'notes'; format = '10A'
    name = 'spectrum'; format = '10E'
    name = 'flag'; format = 'L'
    name = 'intarray'; format = '4I'; dim = '(2, 2)'
)

注釈

古いバージョンに詳しいユーザー astropy 何があったのか知りたくなる astropy.io.fits.new_table それがそうです。 BinTableHDU.from_columns() それとセットになったASCII表 TableHDU.from_columns() それらが受け入れるパラメータは、それらの動作と同じであるが、それらが作成したテーブルHDUのタイプはより明確である。

新しく作成されたHDUタイトルを表示すると、関連するキーワードが正しく充填されていることが表示されます:

>>> hdu.header
XTENSION= 'BINTABLE'           / binary table extension
BITPIX  =                    8 / array data type
NAXIS   =                    2 / number of array dimensions
NAXIS1  =                   73 / length of dimension 1
NAXIS2  =                    4 / length of dimension 2
PCOUNT  =                    0 / number of group parameters
GCOUNT  =                    1 / number of groups
TFIELDS =                    6 / number of table fields
TTYPE1  = 'target  '
TFORM1  = '10A     '
TTYPE2  = 'counts  '
TFORM2  = 'J       '
TUNIT2  = 'DN      '
TTYPE3  = 'notes   '
TFORM3  = '10A     '
TTYPE4  = 'spectrum'
TFORM4  = '10E     '
TTYPE5  = 'flag    '
TFORM5  = 'L       '
TTYPE6  = 'intarray'
TFORM6  = '4I      '
TDIM6   = '(2, 2)  '

警告

注意すべきは、新しい表を作成する際に BinTableHDU.from_columns() すると,すべての入力列配列のメモリ中のコピーが作成される.これは,列がメモリ中で行を主とする順序で連続して配列されている保証がないため(実際にはそうでない可能性が高い),新たな配列に組み合わせなければならないためである.

しかし配列データが is メモリ内で連続している(例えば、既存の記録配列において)、雑然としたデータを使用して、コピーを必要とすることなく、新しいテーブルHDUを作成することができる。まず、以前のように列を作成しますが、使用しません array= 論拠::

>>> col1 = fits.Column(name='target', format='10A')

そして電話して BinTableHDU.from_columns() **

>>> hdu = fits.BinTableHDU.from_columns([col1, col2, col3, col4, col5])

これは、以前のように正しい列定義を有するが、空のデータ部分を有する新しいテーブルHDUを作成するであろう。ここで、配列をHDUのデータ属性に直接割り当てることができます:

>>> hdu.data = mydata

未来版の astropy テーブル作成は簡略化され、このプロセスはもはや必要ではないだろう。

表を時間列に合わせる

♪the FITS Time standard paper FITSファイルにタイミング情報を表示するためのフォーマットおよびキーワードを定義する。♪the astropy FITSパケットはネイティブ読み書きをサポートしております Time このフォーマットの列とオブジェクトを使用する.これは FITS 統合I/Oインターフェースおよび用法例は、中で見つけることができます TDISPnキーワード 一節です。サポートは完全ではなく、完全な基準のサブセットのみが達成される。

例を引く

以下に、時間列を有するバイナリテーブル(イベントリスト)のタイトル抽出例を示す。

COMMENT      ---------- Globally valid key words ----------------
TIMESYS = ’TT      ’          / Time system
MJDREF  = 50814.000000000000  / MJD zero point for (native) TT (= 1998-01-01)
MJD-OBS = 53516.257939301     / MJD for observation in (native) TT

COMMENT      ---------- Time Column -----------------------
TTYPE1  = ’Time    ’          / S/C TT corresponding to mid-exposure
TFORM1  = ’2D      ’          / format of field
TUNIT1  = ’s       ’
TCTYP1  = ’TT      ’
TCNAM1  = ’Terrestrial Time’  / This is TT
TCUNI1  = ’s       ’

しかしFITS規格と astropy 時間オブジェクトのマッピングは完璧ではなく、いくつかの妥協をしなければならない。ユーザーの理解を助けるために astropy コードはこれらの場合を処理し,以下のテキストで記述される astropy 細かいところがあります。

FITS時間基準に適合するFITS列を作成するために考えた. FITS Time paper それがそうです。

記憶のために Time FITSテーブルの列は、1つを作成することです Header 適切な時間座標を有するグローバル参照キーワードと、列固有のカバーキーワードとを有する。このモジュールは astropy.io.fits.fitstime 処理時間列の読み出しと書き込み.

以下のキーワード設定時間座標範囲:

  • 時間尺度.

    すべてのメタデータの中で最も重要なのは時間スケールであり,時間を測定する規範である.

    TIMESYS (string-valued)
    Time scale; default UTC
    
    TCTYPn (string-valued)
    Column-specific override keyword

    グローバル時間スケールは、表等価キーワードに記録された時間スケールでカバーすることができる TCTYPn FITSテーブル列における時間座標に用いられる. TCTYna 座標を代替するために使われています

  • 時間基準

    HDU内のすべての時間は、相対的な基準時点である。同一表に複数の時間列がある場合には文脈に特定されない引用時間がないため,他のいくつかのキーワードを用いて列の引用時間を調整する必要がある.

    参照時間点は、以下の3つのキーワードのうちの1つで指定され、これら3つのキーワードは、優先順位が逓減して列挙される。

    MJDREF (floating-valued)
    Reference time in MJD
    
    JDREF (floating-valued)
    Reference time in JD
    
    DATEREF (datetime-valued)
    Reference time in ISO-8601

    時間参照キーワード(MJDREF,JDREF,DATEREF)使用中に指定された時間スケールを用いて解釈する TIMESYS それがそうです。

    注釈

    この3つのキーワードが存在しなければ,HDU中のすべての時間をISO-8601で表す限り問題ない. Datetime Strings フォーマット: CCYY-MM-DD[Thh:mm:ss[.s...]] (例えば、 "2015-04-05T12:22:33.8" );そうでなければ、MJDREF=0.0と仮定しなければならない。

    参照時間の値は、すべての時間値に対してグローバル有効性を有するが、それに関連する特定の時間スケールはない。そこで私たちは TCRVLn (時間座標参照値)キーワードは、時間スケール差を補償する。

  • 時間基準位置

    キーワード指定の参照位置 TREFPOS なお、時間的に有効な空間位置を指定することは、観測を行う位置であってもよいし、空間に光が適用されたときに補正された点であってもよい。これは標準的な位置かもしれません GEOCENTER あるいは…。 TOPOCENTER )または特定の座標によって定義される空間内の点。

    TREFPOS (string-valued)
    Time reference position; default TOPOCENTER
    
    TRPOSn (string-valued)
    Column-specific override keyword

    注釈

    TOPOCENTERについては,天文台の位置(ITRSデカルト座標または大地緯度/経度/高さ)を指定する必要がある OBSGEO-* キーワードです。

  • 時間基準方向

    タイムスタンプに経路長補正が適用された場合(すなわち、基準位置がない場合 TOPOCENTER 観測データ)の場合、データの適切な分析軌跡を維持するために、経路長遅延を計算するための基準方向が提供されるべきである。しかし,これは観測を行う位置(天文台位置)に関する情報もある場合にのみ有用である.

    引用方向は特定のキーワードを引用することで指示される.これらのキーワードは、方向を明示的に保持するか、または座標を保持する列を示すことができる。

    TREFDIR (string-valued)
    Pointer to time reference direction
    
    TRDIRn (string-valued)
    Column-specific override keyword
  • 時間単位.

    FITS標準は,時間単位を仕様で許される単位の1つとすることを提案している.

    TIMEUNIT (string-valued)
    Time unit; default s
    
    TCUNIn (string-valued)
    Column-specific override
  • 時間ずれ量

    単一のキーワードに数字を入れることで,統一クロック補正を一括して適用できることが便利である場合がある.時間オフセットの第2の使用は、タイムスタンプにおいてゼロ相対時間以上の精度を使用することを可能にするために、ゼロオフセットを相対時系列に設定することである。そのデフォルト値はゼロである.

    TIMEOFFS (floating-valued)
    This has global validity
  • 必要に応じて、絶対、相対誤差、および時間分解能、時間ビニングを使用することができる。

以下のキーワードは、グローバル時間情報キーワードを定義する:

  • 日付と日付**キーワード

    これらは、ISO−8601におけるHDUの作成および観察の日付を定義している。 DATE 文書が地球表面に構築されており,他の文書が以下に与える時間範囲内であれば,協調世界時(UTC)単位とする. TIMESYS それがそうです。

  • MJD-*キーワード

    これらの定義は上と同じですが MJD (改正儒略日)。

この実現は,上記のFITSキーワードのサブセットを作成し,これらのキーワードを時間メタデータにマッピングする.時間は本質的に座標なので World Coordinate System 空間座標規範。そこで,時間列付きFITSテーブルを読み込む際には,FITS WCS標準ルールとアドバイスを用いて座標列が確かに時間であることを検証する.