混合柱

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")

あなたは便利に Table 至る QTable その逆:

>>> 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

次の表は,混合列を含む表に対する高度な操作支援をまとめたものである.

操作

支持する.

グループ化操作

まだ施行されていないが、根本的な制限はない。

垂直スタック

使用可能である. Quantity subclasses, Time and any other mixin classes that provide a new_like() method はい。 info 記述子。

水平スタック.

出力混合列がマスクをサポートするか、またはマスクを必要としない場合、機能する。

合流する.

出力混合列がマスクをサポートするか、またはマスクを必要としない場合、動作する;キー列は、でなければならない numpy.ndarray それがそうです。

唯一の行

まだ実現されておらず、グループ化動作が使用される。

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}>"