よく知らない物体¶
本章では,あまり用いられていないFITSデータ構造について議論する.これらは、ASCIIテーブル、可変長テーブル、およびランダムアクセスグループFITファイルを含む。
ASCII表¶
FITS標準では,バイナリとASCIIテーブルを同時にサポートしている.ASCII表では,すべてのデータが人間が可読なテキスト形式で格納されているため,テキストを解析してデジタルデータを取得するためにより多くの空間を占有して余分な処理を行う.列のフォーマット設定により,浮動小数点データも精度が失われる可能性がある.
はい。 astropy
ASCII表とバイナリ表のインタフェースはほぼ同じである(すなわちデータは .data
属性と field()
メソッドは列を参照して1つを返す. numpy
配列)。時計を読むとき astropy
それがどんなタイプのテーブルか自動的にチェックします。
>>> from astropy.io import fits
>>> filename = fits.util.get_testdata_filepath('ascii.fits')
>>> hdul = fits.open(filename)
>>> hdul[1].data[:1]
FITS_rec([(10.123, 37)],
dtype=(numpy.record, {'names':['a','b'], 'formats':['S10','S5'], 'offsets':[0,11], 'itemsize':16}))
>>> hdul[1].data['a']
array([ 10.123, 5.2 , 15.61 , 0. , 345. ])
>>> hdul[1].data.formats
['E10.4', 'I5']
>>> hdul.close()
なお、レコード配列中のフォーマット参照の元データは、ASCII文字列である(したがって、“a 11”および“a 5”)であるが、 .formats
データ属性は、元のフォーマット仕様(‘E 10.4’および‘i 5’)を保持します。
ASCII表の作成¶
ASCIIテーブルを最初から作成することは、バイナリテーブルを作成することと同様です。違いは列定義である.ASCIIテーブルの列/フィールドは、バイナリテーブルの列/フィールドよりも限られている。これは,1つのセルに複数の値があることを許さない.さらに、バイナリテーブルで許容されるサブセット、すなわち文字列、整数および(単精度および倍精度)浮動小数点数のみをサポートする。ブール値や複数の使用は許されない.
フォーマット文法(TFormキーワードの値)はバイナリ表とは異なる.これらは
Aw Character string
Iw (Decimal) Integer
Fw.d Double precision real
Ew.d Double precision real, in exponential notation
Dw.d Double precision real, in exponential notation
ここでwは幅,dは小数点以下の桁数である.ASCII表とバイナリ表の間の文法の違いが混同される可能性がある例えば、3文字の文字列フィールドは、バイナリテーブルでは‘3 A’に指定され、ASCIIテーブルでは‘A 3’として指定される。
もう一つの違いは使用していることです TableHDU.from_columns()
方法、そしてこの方法 Column
あなたに提供すべきです ascii=True
明確にするために、私は言葉を曖昧にすることができない。
注釈
バイナリテーブルは多くのFITSファイルでより一般的であるにもかかわらず、以前のバージョンのFITSフォーマットはASCIIフォームのみをサポートしています。だからこのクラスは TableHDU
ASCII表を具体的に示すために用いられ, BinTableHDU
より明確に言えば、バイナリテーブルを表しています。これらの名前は XTENSION
表タイトル中のキーワード,そのキーワードは TABLE
ASCII表和の場合 BINTABLE
二進表に使います。
TableHDU.from_columns()
以下のように使用することができる。
>>> import numpy as np
>>> a1 = np.array(['abcd', 'def'])
>>> r1 = np.array([11., 12.])
>>> col1 = fits.Column(name='abc', format='A3', array=a1, ascii=True)
>>> col2 = fits.Column(name='def', format='E', array=r1, bscale=2.3,
... bzero=0.6, ascii=True)
>>> col3 = fits.Column(name='t1', format='I', array=[91, 92, 93], ascii=True)
>>> hdu = fits.TableHDU.from_columns([col1, col2, col3])
>>> hdu.data
FITS_rec([('abc', 11.0, 91), ('def', 12.0, 92), ('', 0.0, 93)],
dtype=(numpy.record, [('abc', 'S3'), ('def', 'S15'), ('t1', 'S10')]))
列のフォーマットがASCII表に明示的に特定されている場合には,指定する必要はないことに注意されたい ascii=True
はい。 ColDefs
構造関数。この場合には is 曖昧さはフォーマットコードのせいです 'I'
バイナリテーブル中の16ビットの整数を表すが,ASCII表では技術的に有効なフォーマットではない.技術的には、ASCII表フォーマットコードは、列毎に1文字幅、例えば、1文字幅を必要とする。 'I10'
最大10文字幅の整数を格納できる列を作成するには、以下の操作を実行してください。
しかし astropy
場合によっては幅仕様を省略することが可能である。省略されると 'I'
列フォーマットの設定は、列内のすべての整数を正確に表すために必要な最小幅を使用します。このショートカットを用いる唯一の問題は,バイナリ表との曖昧性である 'I'
フォーマット、したがって指定 ascii=True
なかなかいいやり方だ astropy
ほとんどの場合でもあなたの意味が理解できます)。
可変長配列表¶
FITS規格では可変長配列テーブルもサポートしている.その基本的な考え方は,同じフィールド(列)中のセルを持つテーブルが同じデータタイプを持つが,異なる長さ/次元を持つ必要がある場合があることである.標準表のデータ構造に比べて,異なるセルのデータ長ダイナミックレンジが大きい場合には,長テーブルを長くすることでメモリを節約することができる.
可変長配列テーブルは、1つまたは複数の可変長フィールド(列)を有することができる。同じテーブル内の残りのフィールド(列)は、依然として固定長の従来のフィールドであってもよい。 astropy
読み取り中にそれがどのタイプのフィールドであるかを自動的に検出し、ユーザが特別な動作を実行する必要はない。データタイプ仕様(すなわち、TFormキーワードの値)は、追加のアルファベット‘P’を使用し、フォーマットは:
rPt(max)
どこだ? r
0または1であってもよい(可変長配列には適用できないので、通常は省略されている)、 t
基本データタイプ(L、B、I、Jなど)のアルファベットコードのうちの1つであり、現在の可変長配列フィールドはXフォーマットをサポートしていない。 astropy
)、そして、 max
列中の任意の配列の最大要素数.したがって、可変長フィールドint 16の場合、対応するフォーマット仕様は、例えば‘pj(100)’である。
例を引く¶
この例では,データタイプがint 16:の可変長配列フィールドを示している.
>>> filename = fits.util.get_testdata_filepath('variable_length_table.fits')
>>> hdul = fits.open(filename)
>>> hdul[1].header['tform1']
'PI(3)'
>>> print(hdul[1].data.field(0))
[array([45, 56], dtype=int16) array([11, 12, 13], dtype=int16)]
>>> hdul.close()
このフィールドでは、第1の行は1つの要素を有し、第2の行は2つの要素を有し、以下同様である。可変長フィールドへのアクセスは、通常のフィールドとほぼ同じであるが、通常、フィールド全体を同時に動作させることは不可能である。ユーザは、それらが独立した配列であるかのように、フィールドをプログレッシブに処理しなければならない。
可変長配列テーブルの作成¶
可変長テーブルの作成は、通常テーブルの作成とほぼ同じである。唯一の違いは、作成されたフィールド定義が可変長配列であることである。まず、データタイプ仕様には‘P’アルファベットが必要であり、第2に、フィールドデータはオブジェクト配列でなければならない(例えば、 numpy
モジュール).
例を引く¶
以下は、2つのフィールドを含むテーブルを作成する例であり、1つは通常のフィールドであり、他方は可変長配列である。
>>> col1 = fits.Column(
... name='var', format='PI()',
... array=np.array([[45, 56], [11, 12, 13]], dtype=np.object_))
>>> col2 = fits.Column(name='xyz', format='2I', array=[[11, 3], [12, 4]])
>>> hdu = fits.BinTableHDU.from_columns([col1, col2])
>>> data = hdu.data
>>> data
FITS_rec([([45, 56], [11, 3]), ([11, 12, 13], [12, 4])],
dtype=(numpy.record, [('var', '<i4', (2,)), ('xyz', '<i2', (2,))]))
>>> hdu.writeto('variable_length_table.fits')
>>> with fits.open('variable_length_table.fits') as hdul:
... print(repr(hdul[1].header))
XTENSION= 'BINTABLE' / binary table extension
BITPIX = 8 / array data type
NAXIS = 2 / number of array dimensions
NAXIS1 = 12 / length of dimension 1
NAXIS2 = 2 / length of dimension 2
PCOUNT = 10 / number of group parameters
GCOUNT = 1 / number of groups
TFIELDS = 2 / number of table fields
TTYPE1 = 'var '
TFORM1 = 'PI(3) '
TTYPE2 = 'xyz '
TFORM2 = '2I '
ランダムアクセスグループ¶
FITS標準でサポートされているもう1つの慣れていないデータ構造は,ランダムアクセスグループである.この約束はバイナリテーブル拡張を導入する前に確立された。ほとんどの場合、それの使用はもう二進表によって代替されることができる。これは主に無線干渉測定に用いられる。
マスターHDUと同様に、ランダムアクセスグループHDUは、常にFITSファイルの最初のHDUである。そのデータは1つ以上のグループを持っている。各グループは、任意の数(0を含む)のパラメータおよび画像を有することができる。パラメータと画像は同じデータタイプを持つ.
同一HDU中のすべてのグループは、画像データのデータタイプ(キーワードBITPIXで指定され、画像HDUと同じ)、パラメータ数(PCOUNTで指定される)、サイズおよび形状(NAXISnキーワードで指定される)を同じデータ構造を有する。グループ数はGCOUNTで指定され,キーワードNAXIS 1はつねに0である.したがって、ランダムアクセスグループHDUの総データサイズは、以下のようになる。
|BITPIX| * GCOUNT * (PCOUNT + NAXIS2 * NAXIS3 * ... * NAXISn)
見出しと要約¶
ランダムアクセスグループHDUのヘッダは、他のHDUと区別されません。head属性を使用することができます。
HDUの内容も同様に使用することができます HDUList.info()
方法:
>>> filename = fits.util.get_testdata_filepath('group.fits')
>>> hdul = fits.open(filename)
>>> hdul[0].header['groups']
True
>>> hdul[0].header['gcount']
10
>>> hdul[0].header['pcount']
3
>>> hdul.info()
Filename: ...group.fits
No. Name Ver Type Cards Dimensions Format
0 PRIMARY 1 GroupsHDU 15 (5, 3, 1, 1) float32 10 Groups 3 Parameters
データ:グループパラメータ¶
他のHDUと同様に、ランダムアクセスグループHDUのデータ部分は .data
属性です。これはパラメータと画像配列を含む.
実例.¶
パラメータおよびデータを含む第3のグループの内容を表示するには、以下の操作を実行してください。
>>> hdul[0].data[2]
(2.0999999, 42.0, 42.0, array([[[[30., 31., 32., 33., 34.],
[35., 36., 37., 38., 39.],
[40., 41., 42., 43., 44.]]]], dtype=float32))
データは、まず、指定されたグループのすべてのパラメータをリストし、その後、画像配列をリストする。注意すべきことは,このファイル中の画像データの形状はPythonまたはCコミットメントでは(1,1,1,4,3),IRAFまたはFortranコミットメントでは(3,4,1,1,1)であることである.
これらのパラメータにアクセスするには、まず使用してください .parnames
属性::
>>> hdul[0].data.parnames # get the parameter names
['abc', 'xyz', 'xyz']
グループパラメータは par()
方法です。このテーブルが好きです field()
方法は、パラメータはindexまたはname:であってもよい。
>>> hdul[0].data.par(0)[8] # Access group parameter by name or by index
8.1
>>> hdul[0].data.par('abc')[8]
8.1
パラメータ名‘xyz’が2回出現していることに注意してください。これは、ランダムアクセスグループの1つの機能であり、これらの値を加算することを意味する。そのため:
>>> hdul[0].data.parnames # get the parameter names
['abc', 'xyz', 'xyz']
>>> hdul[0].data.par(1)[8] # Duplicate parameter name 'xyz'
42.0
>>> hdul[0].data.par(2)[8]
42.0
>>> # When accessed by name, it adds the values together if the name is
>>> # shared by more than one parameter
>>> hdul[0].data.par('xyz')[8]
84.0
♪the par()
データオブジェクト全体または1つのデータ項目(グループ)のための方法である。したがって,あるグループのグループパラメータを取得する2つの可能な方法があり,これは表データ中の場合(それを用いる)と類似している. field()
方法):
>>> hdul[0].data.par(0)[8]
8.1
>>> hdul[0].data[8].par(0)
8.1
一方,グループパラメータを修正するためには,新しい値(最後に行/グループ番号にアクセスする場合)を直接割り当てたり,使用したりすることができる. setpar()
方法(まず行/グループ番号にアクセスする場合).方法 setpar()
パラメータが複数のパラメータによって共有される場合、名前別に更新する必要がある:
>>> # Update group parameter when selecting the row (group) number last
>>> hdul[0].data.par(0)[8] = 99.
>>> # Update group parameter when selecting the row (group) number first
>>> hdul[0].data[8].setpar(0, 99.) # or:
>>> hdul[0].data[8].setpar('abc', 99.)
>>> # Update group parameter by name when the name is shared by more than
>>> # one parameters, the new value must be a tuple of constants or
>>> # sequences
>>> hdul[0].data[8].setpar('xyz', (2445729., 0.3))
>>> hdul[0].data[8:].par('xyz')
array([2.44572930e+06, 8.40000000e+01])
データ:画像データ¶
データ部分の画像配列は data
データオブジェクトの属性。A numpy
配列に戻る::
>>> print(hdul[0].data.data[8])
[[[[120. 121. 122. 123. 124.]
[125. 126. 127. 128. 129.]
[130. 131. 132. 133. 134.]]]]
>>> hdul.close()
ランダムアクセスグループHDUの作成¶
最初からランダムアクセスグループHDUを作成しますので、ご利用ください GroupData
グループデータ構造にデータをカプセル化して使用する GroupsHDU
HDU自体を作成することができます
例を引く¶
ランダムアクセスグループHDUを作成するには、以下の操作を実行してください。
>>> # Create the image arrays. The first dimension is the number of groups.
>>> imdata = np.arange(150.0).reshape(10, 1, 1, 3, 5)
>>> # Next, create the group parameter data, we'll have two parameters.
>>> # Note that the size of each parameter's data is also the number of
>>> # groups.
>>> # A parameter's data can also be a numeric constant.
>>> pdata1 = np.arange(10) + 0.1
>>> pdata2 = 42
>>> # Create the group data object, put parameter names and parameter data
>>> # in lists assigned to their corresponding arguments.
>>> # If the data type (bitpix) is not specified, the data type of the
>>> # image will be used.
>>> x = fits.GroupData(imdata, bitpix=-32,
... parnames=['abc', 'xyz', 'xyz'],
... pardata=[pdata1, pdata2, pdata2])
>>> # Now, create the GroupsHDU and write to a FITS file.
>>> hdu = fits.GroupsHDU(x)
>>> hdu.writeto('test_group.fits')
>>> hdu.header
SIMPLE = T / conforms to FITS standard
BITPIX = -32 / array data type
NAXIS = 5 / number of array dimensions
NAXIS1 = 0
NAXIS2 = 5
NAXIS3 = 3
NAXIS4 = 1
NAXIS5 = 1
EXTEND = T
GROUPS = T / has groups
PCOUNT = 3 / number of parameters
GCOUNT = 10 / number of groups
PTYPE1 = 'abc '
PTYPE2 = 'xyz '
PTYPE3 = 'xyz '
>>> data = hdu.data
>>> hdu.data
GroupData([ (0.1 , 42., 42., [[[[ 0., 1., 2., 3., 4.], [ 5., 6., 7., 8., 9.], [ 10., 11., 12., 13., 14.]]]]),
(1.10000002, 42., 42., [[[[ 15., 16., 17., 18., 19.], [ 20., 21., 22., 23., 24.], [ 25., 26., 27., 28., 29.]]]]),
(2.0999999 , 42., 42., [[[[ 30., 31., 32., 33., 34.], [ 35., 36., 37., 38., 39.], [ 40., 41., 42., 43., 44.]]]]),
(3.0999999 , 42., 42., [[[[ 45., 46., 47., 48., 49.], [ 50., 51., 52., 53., 54.], [ 55., 56., 57., 58., 59.]]]]),
(4.0999999 , 42., 42., [[[[ 60., 61., 62., 63., 64.], [ 65., 66., 67., 68., 69.], [ 70., 71., 72., 73., 74.]]]]),
(5.0999999 , 42., 42., [[[[ 75., 76., 77., 78., 79.], [ 80., 81., 82., 83., 84.], [ 85., 86., 87., 88., 89.]]]]),
(6.0999999 , 42., 42., [[[[ 90., 91., 92., 93., 94.], [ 95., 96., 97., 98., 99.], [100., 101., 102., 103., 104.]]]]),
(7.0999999 , 42., 42., [[[[105., 106., 107., 108., 109.], [110., 111., 112., 113., 114.], [115., 116., 117., 118., 119.]]]]),
(8.10000038, 42., 42., [[[[120., 121., 122., 123., 124.], [125., 126., 127., 128., 129.], [130., 131., 132., 133., 134.]]]]),
(9.10000038, 42., 42., [[[[135., 136., 137., 138., 139.], [140., 141., 142., 143., 144.], [145., 146., 147., 148., 149.]]]])],
dtype=(numpy.record, [('abc', '<f4'), ('xyz', '<f4'), ('_xyz', '<f4'), ('DATA', '<f4', (1, 1, 3, 5))]))
画像データを圧縮する¶
圧縮画像データをFITSバイナリテーブルに格納するための汎用技術が開発されている。この約定で用いる原則は,まずn次元画像をサブ画像または“平敷き”の矩形メッシュに分割することである.そして、各タイルを連続するデータブロックに圧縮し、得られた圧縮ワードをFITSバイナリ内の可変長列の行に絞り格納する。いくつかの一般的な画像タイル圧縮アルゴリズムをサポートする。これには、Gzip、Rice、IRAF画素リスト(Plio)、Hcompressが含まれる。
詳細については、以下のサイトの“A Fits Image Compression Proposal”を参照してください。
“登録FITS約束、タイル画像圧縮約束”:
圧縮された画像データに以下の位置でアクセスする astropy
オプションのものを使用します astropy.io.fits.compression
1つのC共有ライブラリ(compression.so)に含まれるモジュール.圧縮モジュールが利用できないときに圧縮画像データを含むHDUへのアクセスを試みる場合、この問題をユーザに通知し、HDUを標準バイナリテーブルHDUとみなす。この通知は,圧縮画像データに初めて遭遇した場合にのみ発行される.これにより,圧縮モジュールを必要とせずに実現できる. astropy
仕事に行きます。
見出しと要約¶
はい。 astropy
圧縮画像HDUのヘッダは、ユーザにとって任意の画像ヘッダのようである。FITSファイルに格納された実際のヘッダは、約定によって定義された特殊なキーワードのセットによって圧縮画像を記述する構造を有するバイナリテーブルHDUのヘッダである。バイナリテーブルHDUヘッダとミラーHDUヘッダとの変換は舞台裏で行われている。HDUは実際にはバイナリテーブルであるため、FITSファイルにプライマリHDUが表示されない可能性がある。
例を引く¶
HDUヘッダの内容は使用可能 .header
属性::
>>> filename = fits.util.get_testdata_filepath('compressed_image.fits')
>>> hdul = fits.open(filename)
>>> hdul[1].header
XTENSION= 'IMAGE ' / Image extension
BITPIX = 16 / data type of original image
NAXIS = 2 / dimension of original image
NAXIS1 = 10 / length of original image axis
NAXIS2 = 10 / length of original image axis
PCOUNT = 0 / number of parameters
GCOUNT = 1 / number of groups
対応するバイナリテーブルHDUのコンテンツは、隠れたものを使用することができます ._header
属性です。しかしながら、HDUヘッダを有するすべてのユーザインタフェースは、画像ヘッダを通過すべきである( .header
属性)::
>>> hdul[1]._header
XTENSION= 'BINTABLE' / binary table extension
BITPIX = 8 / array data type
NAXIS = 2 / number of array dimensions
NAXIS1 = 8 / width of table in bytes
NAXIS2 = 10 / number of rows in table
PCOUNT = 60 / number of group parameters
GCOUNT = 1 / number of groups
TFIELDS = 1 / number of fields in each row
TTYPE1 = 'COMPRESSED_DATA' / label for field 1
TFORM1 = '1PB(6) ' / data format of field: variable length array
ZIMAGE = T / extension contains compressed image
ZTENSION= 'IMAGE ' / Image extension
ZBITPIX = 16 / data type of original image
ZNAXIS = 2 / dimension of original image
ZNAXIS1 = 10 / length of original image axis
ZNAXIS2 = 10 / length of original image axis
ZPCOUNT = 0 / number of parameters
ZGCOUNT = 1 / number of groups
ZTILE1 = 10 / size of tiles to be compressed
ZTILE2 = 1 / size of tiles to be compressed
ZCMPTYPE= 'RICE_1 ' / compression algorithm
ZNAME1 = 'BLOCKSIZE' / compression block size
ZVAL1 = 32 / pixels per block
ZNAME2 = 'BYTEPIX ' / bytes per pixel (1, 2, 4, or 8)
ZVAL2 = 2 / bytes per pixel (1, 2, 4, or 8)
EXTNAME = 'COMPRESSED_IMAGE' / name of this binary table extension
HDUの内容は使用することで info()
便利な機能や方法:
>>> fits.info(filename)
Filename: ...compressed_image.fits
No. Name Ver Type Cards Dimensions Format
0 PRIMARY 1 PrimaryHDU 4 ()
1 COMPRESSED_IMAGE 1 CompImageHDU 7 (10, 10) int16
>>> hdul.info()
Filename: ...compressed_image.fits
No. Name Ver Type Cards Dimensions Format
0 PRIMARY 1 PrimaryHDU 4 ()
1 COMPRESSED_IMAGE 1 CompImageHDU 7 (10, 10) int16
データ.データ¶
ヘッダと同様に、圧縮画像HDUのデータは、ユーザから見て標準的な非圧縮画像データである。実データは、少なくとも1列(COMPRESSED_DATA)を含むバイナリテーブルデータとしてFITSファイルに格納される。可変長列の各行は、対応する画像ブロックを圧縮した結果として生成されるワードスロットルを含む。またいくつかのオプションの列が出現する可能性がある.圧縮不能な平坦化された未圧縮画素値を保存するためのUNCOMPRESSED_DATAと、元の未圧縮値を元の画像画素値に変換する際に必要とされる可能性のある線形スケーリング係数および零点オフセットを保存するZSCALEおよびZZEROと、ある場合、画像中の未定義画素を表す整数値を保存するZBLANKと、を含む。
例を引く¶
未圧縮HDUデータのコンテンツはご利用いただけます .data
属性::
>>> hdul[1].data
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
[40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
[50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
[60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
[70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
[80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]], dtype=int16)
>>> hdul.close()
圧縮データは .compressed_data
属性であるが,その属性に直接アクセスする必要は少ない.これは、最初にデータを解凍する必要がなく、圧縮データの直接コピーを実行するために有用である可能性がある。
圧縮画像HDUの作成¶
圧縮イメージHDUを最初から作成するには、1つを構築してください CompImageHDU
対象が圧縮されていない画像データ配列及びそれに関連する画像ヘッダを提供する。そこから、HDUは、他の画像HDUのように扱うことができる。
例を引く¶
圧縮イメージHDUを作成するには、以下の操作を実行してください。
>>> imageData = np.arange(100).astype('i2').reshape(10, 10)
>>> imageHeader = fits.Header()
>>> hdu = fits.CompImageHDU(imageData, imageHeader)
>>> hdu.writeto('compressed_image.fits')
のAPI文書 CompImageHDU
初期値設定項方法記述構造 CompImageHDU
物体です。