混合柱¶
astropy
表は表の“混合列”の概念をサポートしており,これにより適切な非統合を可能にする Column
中クラスオブジェクトに基づく Table
相手。これらのMixin列オブジェクトは何の方法でも変換されるのではなく,ローカルに使用される.
使用可能な内蔵混合列クラスは、:
例を引く¶
例えば、テーブルを作成し、時間列を追加することができます。
>>> from astropy.table import Table
>>> from astropy.time import Time
>>> t = Table()
>>> t['index'] = [1, 2]
>>> t['time'] = Time(['2001-01-02T12:34:56', '2001-02-03T00:01:02'])
>>> print(t)
index time
----- -----------------------
1 2001-01-02T12:34:56.000
2 2001-02-03T00:01:02.000
ここで重要なのは time
コラムは本当のものです Time
対象::
>>> t['time']
<Time object: scale='utc' format='isot' value=['2001-01-02T12:34:56.000' '2001-02-03T00:01:02.000']>
>>> t['time'].mjd
array([51911.52425926, 51943.00071759])
数量と数量表¶
生来の処理能力 Quantity
表中の対象は,単位操作テーブルデータを自然かつロバストに用いた方が便利になっている.しかしながら、この機能は、単位を有するデータ(例えば、FITSバイナリ表から)を表すことができるので、曖昧性を導入する。 Column
1つを使う unit
属性や Quantity
相手。この曖昧な問題をてきぱきと解決するためには astropy
定義する. Table
呼び出しのクラス QTable
それがそうです。♪the QTable
類と類 Table
それを除いて Quantity
定義された単位を持つ任意のデータ列のデフォルト値である.
もしあなたが利用すれば Quantity
では、お客様の分析にインフラをご利用ください QTable
単位を含むテーブルを作成するための第一選択方式である.記述ラベルとして表列単位をより多く使用するように変更すると、 Table
クラスは一番よく使われるクラスかもしれません。
例を引く¶
これらの概念を説明するために、まず基準を作ります Table
ここでは入力として Time
相手と一つ Quantity
単位は m / s
それがそうです。本例では、数は、 Column
(それは1つある unit
属性はありますが、持っていません Quantity
):
>>> import astropy.units as u
>>> t = Table()
>>> t['index'] = [1, 2]
>>> t['time'] = Time(['2001-01-02T12:34:56', '2001-02-03T00:01:02'])
>>> t['velocity'] = [3, 4] * u.m / u.s
>>> print(t)
index time velocity
m / s
----- ----------------------- --------
1 2001-01-02T12:34:56.000 3.0
2 2001-02-03T00:01:02.000 4.0
>>> type(t['velocity'])
<class 'astropy.table.column.Column'>
>>> t['velocity'].unit
Unit("m / s")
>>> (t['velocity'] ** 2).unit # WRONG because Column is not smart about unit
Unit("m / s")
そこで数値表を使って同じことをしましょう QTable
**
>>> from astropy.table import QTable
>>> qt = QTable()
>>> qt['index'] = [1, 2]
>>> qt['time'] = Time(['2001-01-02T12:34:56', '2001-02-03T00:01:02'])
>>> qt['velocity'] = [3, 4] * u.m / u.s
♪the velocity
列は今一つです Quantity
これに応じて、以下の動作が実行される。
>>> type(qt['velocity'])
<class 'astropy.units.quantity.Quantity'>
>>> qt['velocity'].unit
Unit("m / s")
>>> (qt['velocity'] ** 2).unit # GOOD!
Unit("m2 / s2")
>>> qt2 = QTable(t)
>>> type(qt2['velocity'])
<class 'astropy.units.quantity.Quantity'>
>>> t2 = Table(qt2)
>>> type(t2['velocity'])
<class 'astropy.table.column.Column'>
注釈
要するに: only 両者の違い QTable
そして Table
指定された単位を持つ列を追加する際の行為.使用 QTable
このような列は常に Quantity
オブジェクトは,それを表に追加する.同様に,既存の無単位で単位が指定されていれば Column
1つは QTable
この列は変換されます Quantity
それがそうです。
その逆も同様です Quantity
列は通常列に回復する Table
そして普通のものに変換されます Column
それなりのものを持っている unit
属性です。
混合属性¶
The usual column attributes name
, dtype
, unit
, format
, and
description
are available in any mixin column via the info
property:
>>> qt['velocity'].info.name
'velocity'
これが…。 info
属性は重要な接着剤であり、非列オブジェクトの動作が列と非常に類似していることを可能にする。
同じ info
属性には標準バージョンもございます Column
物体です。これらは info
属性、例えば t['a'].info.name
直接を参照してください Column
属性(例えば、 t['a'].name
)、交換して使用することができます。同じように Quantity
相手は、 info.dtype
属性引用ネイティブ dtype
対象の属性。
注釈
混在列である可能性のある列オブジェクトを扱う汎用コードを作成する際には,必要である. いつも 使用 info
属性は列属性にアクセスする.
詳細情報と注意事項¶
混合列が表の一部である場合,多くの一般的な表操作は期待どおりに操作される.しかし、現在の実施には限界がある。
行の追加または挿入
行の追加または挿入は、可変(データは内部で変更可能)にのみ適用され、有しています。 insert()
方法です。 Quantity
そして Time
支持する. insert()
しかし例えば SkyCoord
そんなことないよ。1行を1行に挿入しようとすると SkyCoord
列には,以下のような異常が生じる.
ValueError: Unable to insert row because of exception in column 'skycoord':
'SkyCoord' object has no attribute 'insert'
行リストまたは辞書リストから初期化する
この初期化表のパターンは混合列には適用できないため,以下の2つの場合は失敗する.
>>> qt = QTable([{'a': 1 * u.m, 'b': 2},
... {'a': 2 * u.m, 'b': 3}])
Traceback (most recent call last):
...
TypeError: only dimensionless scalar quantities can be converted to Python scalars
>>> qt = QTable(rows=[[1 * u.m, 2],
... [2 * u.m, 3]])
Traceback (most recent call last):
...
TypeError: only dimensionless scalar quantities can be converted to Python scalars
問題は,各カラムの各元素をどのように適切な混合カラムに組み立てるかを知ることである。現在のコード使用 numpy
この関数は、数値タイプまたは文字列タイプで実行されるが、混合列タイプ、例えば混合列タイプは扱わない Quantity
あるいは…。 SkyCoord
それがそうです。
Masking
ハイブリッド列は通常マスクをサポートしていません(除く) Time
)であるが、シールドシートに混合を使用するサポートは限られている。本例では1つは mask
属性はMixin列オブジェクトに割り当てられる.これが mask
特別な対象です False
混合データ形状に対応する.♪the mask
普通のように見える numpy
配列ですが、以下の場合には異常が発生します True
どんな要素にも割り当てられています制限の結果は上位表操作の中で最も顕著である.
High-level table operations
次の表は,混合列を含む表に対する高度な操作支援をまとめたものである.
操作 |
支持する. |
---|---|
まだ施行されていないが、根本的な制限はない。 |
|
使用可能である. |
|
出力混合列がマスクをサポートするか、またはマスクを必要としない場合、機能する。 |
|
出力混合列がマスクをサポートするか、またはマスクを必要としない場合、動作する;キー列は、でなければならない |
|
まだ実現されておらず、グループ化動作が使用される。 |
ASCIIフォーム記入
属性Mixin列を含む表をファイルに書きます astropy.io.ascii
モジュールであるが,Cによる高速ライタは利用できない.代わりに純粋なPythonライタを使います混合列を持つ表を作成するには、ご利用をお勧めします 'ecsv'
ASCII形式です。これは、テーブルデータおよびメタデータを完全にシーケンス化し、レビュー時にテーブルの完全な“往復”を可能にする。参照してください ECSVフォーマット もっと細かいことを知っています。
2進表記入
以下から始めます `astropy
3.0では、Mixin列を含むフォームは、FITおよびHDF 5フォーマットを使用してバイナリ形式でファイルを書き込むことができます。これらのファイルを読み返して元のファイルを正確に復元することができます Table
混合列とメタデータが含まれる.参照してください 統一ファイル読み書きインタフェース もっと細かいことを知っています。
混合協定.¶
Mixin列の背後にある重要な思想の1つは,指定されたプロトコルを満たす任意のクラスを使用できることである.これは,配列に類似したデータを扱うユーザ定義のクラスオブジェクトの多くが Table
それがそうです。このプロトコルは比較的簡潔であり,クラスの行為が最小に類似していることを要求する. numpy
以下の属性を持つ配列:
類似配列のデータを含む.
器器器
__getitem__
単一の項、スライス、またはインデックス配列としてのアクセス取得データをサポートします。ある
shape
属性です。ある
__len__
長さの計算方法。ある
info
類似記述子はastropy.utils.data_info.MixinInfo
級友たち。
♪the Example: ArrayWrapper 節では,混合列として利用可能なクラスの最小動作例を示す.A pandas.Series オブジェクトは混合列としても利用可能である.
混合列の他の興味深い可能性は
他の列の関数として動的に計算される列(電子テーブルとも呼ぶ).
列自体が
Table
(すなわち入れ子表)。A proof of concept はい使えます。
New_like()方法¶
このような高度な操作を支援するために join
そして vstack
Mixinクラスは提供されなければなりません new_like()
方法中の info
類記述子。この機能の重要な部分の1つは、入力列メタデータを適切に統合することを保証し、列が形状のような一致した属性を有することを保証することである。
Mixinクラスです new_like()
まだ実施しなければならない __setitem__
サポートは,単一の項,スライス,またはインデックス配列で設定する.
♪the new_like
方法は以下の署名を持つ:
def new_like(self, cols, length, metadata_conflicts='warn', name=None):
"""
Return a new instance of this class which is consistent with the
input ``cols`` and has ``length`` rows.
This is intended for creating an empty column object whose elements can
be set in-place for table operations like join or vstack.
Parameters
----------
cols : list
List of input columns
length : int
Length of the output column object
metadata_conflicts : str ('warn'|'error'|'silent')
How to handle metadata conflicts
name : str
Output column name
Returns
-------
col : object
New instance of this class consistent with ``cols``
"""
この方面の例については,参照されたい ColumnInfo
そして QuantityInfo
授業を受けます。
例:ArrayWrapper¶
以下のコードリストは,Mixin列クラスとして機能するデータコンテナクラスの一例を示す.これはパッケージで包装されています numpy
配列していますこれは astropy
混合試験キットは,混合カラムの要求に完全に適合している。
from astropy.utils.data_info import ParentDtypeInfo
class ArrayWrapper(object):
"""
Minimal mixin using a simple wrapper around a numpy array
"""
info = ParentDtypeInfo()
def __init__(self, data):
self.data = np.array(data)
if 'info' in getattr(data, '__dict__', ()):
self.info = data.info
def __getitem__(self, item):
if isinstance(item, (int, np.integer)):
out = self.data[item]
else:
out = self.__class__(self.data[item])
if 'info' in self.__dict__:
out.info = self.info
return out
def __setitem__(self, item, value):
self.data[item] = value
def __len__(self):
return len(self.data)
@property
def dtype(self):
return self.data.dtype
@property
def shape(self):
return self.data.shape
def __repr__(self):
return f"<{self.__class__.__name__} name='{self.info.name}' data={self.data}>"