マスクと欠損値

♪the astropy.table package provides support for masking and missing values in a table by using the numpy.ma masked array package to define masked columns and by supporting 混合柱 that provide masking. This allows handling tables with missing or invalid entries in much the same manner as for standard (unmasked) tables. It is useful to be familiar with the masked array マスクテーブルを用いた場合の文書 astropy.table それがそうです。

簡単に言うと,その概念は列データ配列構造を反映したブーリアンマスクを定義することである.マスク値のある位置 True, the corresponding entry is considered to be missing or invalid. Operations involving column or row access and slicing are unchanged. The key difference is that arithmetic or reduction operations involving columns or column slices follow the rules for operations on masked arrays それがそうです。

重要

中の変更 astropy 4.0

はい。 astropy 4.0シールドシートの動作が変更され、プログラム機能に影響を与える可能性があります。参照してください シールド中の変更 astropy 4.0 もっと細かいことを知っています。

注釈

操作を簡略化して numpy.sum あるいは…。 numpy.mean マスク(無効)値を無視する約束に従う.これは浮動小数点の振舞いとは違います NaN その配列の和は1つ以上を含む NaN's その結果 NaN それがそうです。

this page NumPy強化推奨24、25、および26に関する情報。

表作成

マスクテーブルは、様々な方法で作成することができる。

MaskedColumnオブジェクトとして1つ以上の列を含むテーブルを作成する

>>> from astropy.table import Table, Column, MaskedColumn
>>> a = MaskedColumn([1, 2], name='a', mask=[False, True], dtype='i4')
>>> b = Column([3, 4], name='b', dtype='i8')
>>> Table([a, b])
<Table length=2>
  a     b
int32 int64
----- -----
    1     3
   --     4

♪the MaskedColumn はい。 Column クラスは、マスクデータ列を作成して動作させるためのインターフェースを提供する。♪the MaskedColumn 類継承自 numpy.ma.MaskedArray これとは対照的に Column それは継承されています numpy.ndarray それがそうです。この違いは,この2つの場合に異なるカテゴリがある要因である.

表出力中のマスクエントリは以下のとおりであることに注意されたい. -- それがそうです。

Create a table with one or more columns as a ``numpy`` MaskedArray

>>> import numpy as np
>>> a = np.ma.array([1, 2])
>>> b = [3, 4]
>>> t = Table([a, b], names=('a', 'b'))

Create a table from list data containing `numpy.ma.masked`

ご利用いただけます numpy.ma.masked マスクまたは無効データを示す定数::

>>> a = [1.0, np.ma.masked]
>>> b = [np.ma.masked, 'val']
>>> Table([a, b], names=('a', 'b'))
<Table length=2>
  a     b
float64 str3
------- ----
    1.0   --
    --  val

埋め込まれたリストから初期化する numpy.ma.masked 元素の速度比を使用する numpy.ma.array あるいは…。 MaskedColumn したがって、性能が問題であれば、可能であれば、あなたは後者の方法を使用しなければならない。

MaskedColumnオブジェクトの既存テーブルへの追加

>>> t = Table([[1, 2]], names=['a'])
>>> b = MaskedColumn([3, 4], mask=[True, False])
>>> t['b'] = b

既存のテーブルに新しい行を追加し、マスクパラメータを指定します

>>> a = Column([1, 2], name='a')
>>> b = Column([3, 4], name='b')
>>> t = Table([a, b])
>>> t.add_row([3, 6], mask=[True, False])

Create a new table object and specify masked=True

もし masked=True テーブルを作成する際に提供されると、各列が作成されます。 MaskedColumn そして新しい列は常に MaskedColumn それがそうです。

>>> Table([(1, 2), (3, 4)], names=('a', 'b'), masked=True, dtype=('i4', 'i8'))
<Table masked=True length=2>
  a     b
int32 int64
----- -----
    1     3
    2     4

表の属性に注意してください mask そして fill_value テーブルを遮蔽するために利用可能である.

既存のテーブルをマスクテーブルに変換する

>>> t = Table([[1, 2], ['x', 'y']])  # standard (unmasked) table
>>> t = Table(t, masked=True, copy=False)  # convert to masked table

この操作は一定時間ごとに Column 至る MaskedColumn また,後続する任意の追加された列がマスクされることを保証する.

表アクセス

データ列、行、および単一の要素にアクセスおよび修正するためのほとんどの標準的な方法は、マスクテーブルにも適用可能である。

2つの微妙な違いがあります Row インデックステーブルの単行で得られたオブジェクト:

  • 標準表に対しては,このような行が2つ等しいかどうかを比較することができるが,シールド表では,この比較に異常が生じる.

この2つの違いは潜在的なからです numpy.ma.MaskedArray 実施する。

遮蔽と充填

この2つは Table そして MaskedColumn クラスは、欠落データまたは無効データを動作させるテーブルをサポートするために、属性および方法を提供する。

日除け.

列のマスクは mask 属性::

>>> t = Table([(1, 2), (3, 4)], names=('a', 'b'), masked=True)
>>> t['a'].mask = [False, True]  # Modify column mask (boolean array)
>>> t['b'].mask = [True, False]  # Modify column mask (boolean array)
>>> print(t)
 a   b
--- ---
  1  --
 --   4

ブロックされたエントリは -- 表を印刷する時。マスクを列または表レベルで直接見ることができます:

>>> t['a'].mask
array([False,  True]...)

>>> t.mask
<Table length=2>
  a     b
 bool  bool
----- -----
False  True
 True False

マスクされた要素のインデックスを取得するためには、次式を使用してください。

>>> t['a'].mask.nonzero()[0]  
array([1])

詰め物をする.

マスク(すなわち、損失または無効)されたエントリは、指定されたパディング値で置き換えることができる。本例では、 MaskedColumn 覆面の Table 標準に変換されます Column テーブルでもありますマスクテーブルの列はそれぞれ1つあります fill_value 属性は、その列のデフォルトパディング値を指定する。実際の入れ替え操作を行いますので、ご利用ください filled() メソッドが呼び出される。デフォルト列をカバーできるオプションのパラメータを採用しています fill_value 属性です。**

>>> t['a'].fill_value = -99
>>> t['b'].fill_value = 33

>>> print(t.filled())
 a   b
--- ---
  1  33
-99   4

>>> print(t['a'].filled())
 a
---
  1
-99

>>> print(t['a'].filled(999))
 a
---
  1
999

>>> print(t.filled(1000))
 a    b
---- ----
   1 1000
1000    4

シールド中の変更 astropy 4.0

はい。 astropy 4.0行動に変更を導入 Table これはマスク列の処理に影響を与える.

4.0の前に、1つ以上を含むために MaskedColumn 列に並んで要求する. 間隔を置いて 列はブロックされ,失われたりデータをマスクしたりしない列であっても同様である.これは最初に実現したものです Table これは1つの numpy 列データであるベースコンテナの構造化配列.以来. astropy 1.0、 Table 対象は列の順序辞書である. (実施の詳細を表にする )であり,かつ列タイプが同質であることは要求されない.

4.0から Table 両者を同時に含むことができる Column そして MaskedColumn 列は、デフォルトの場合、列タイプは、列毎のデータのみによって決定される。

この変更の詳細は以下の各節で議論する.

注釈

多くのアプリケーションに対して,マスク列データを持つアプリケーションであっても,現在ではデフォルト値を用いることを提案している. Table 異種類の柱タイプの行為を許可する。これは表を作ることを意味します もしなければ 指定 masked キーワードパラメータ。

この言葉の意味は masked 表属性.

♪the Table 対象は一つ持っている masked 新しい列を追加する際の表行を決定する属性

  • masked=True :非混合列またはデータは常に変換される MaskedColumn また、Mixin列は mask 必要であれば,属性を追加することができる.

  • masked=False :データの種類や内容に応じて列ごとに追加する.

属性関連の行為。 masked 属性が持つ 未変更 バージョン4.0にあります。変化したのは,4.0から表に含まれている masked=False おそらく含まれています MaskedColumn 柱です。

重要なのは masked 属性は,どの列のデータも実際にマスクしているかどうかを意味しない.一つのテーブルがあります masked=True しかし,どのリスト列にもマスク要素はない.バージョン4.0から、マスクに関するより多くの有用な情報を提供する2つの表属性がある:

  • has_masked_columns :表の中の少なくとも1つ MaskedColumn 縦隊。これは…。 not データ値を実際に遮蔽しているかどうかをチェックする。

  • has_masked_values :TABLEは、1つまたは複数のマスクされた列データ値を有する。大型テーブルの場合、これは、各列のマスク値をチェックする必要があるので、比較的遅い可能性がある。

バージョン4.0から、用語“シールドテーブル”は、作成されたテーブルを使用するためのより狭く一般的ではない場合を保持すべきである masked=True それがそうです。多くの場合、テーブルレベルの“マスク”または“キャンセルマスク”は心配されるべきではなく、単一の列に注目されるべきである。

自動的にシールド状態にアップグレードします

4.0以前のバージョンでは、追加されています MaskedColumn マスク要素を有する新しい行を有するものに追加するか masked=False 設定されます masked=True 他の列を自動的に“アップグレード”します多くの場合、他の欄のこのようなアップグレードは不要であり、嫌なことでもある。

4.0から,データに適した列タイプを用いて新しい列を追加する.例えばもし1つが numpy マスク配列を追加すると,その配列は1つになる. MaskedColumn しかし他の列には影響を与えません masked 属性は False それがそうです。

この変更の一般的な意味は read 意志 いつも ありますか masked=False マスク値を持つ列のみが MaskedColumn それがそうです。4.0までに、入力テーブルにシールド値があれば、戻るテーブルは masked=True そしてすべて MaskedColumn 柱です。次節では一例を示す.

4.0までの行動を回復する

各既存の列または新たに追加された列をマスクする必要があるコードについては,現在明示的に指定する必要がある. masked=True 表を作成する際に。以前、この表は自動的に使用にアップグレードされました MaskedColumn この動作は、第1のマスク列を追加した直後にすべての列に対して実行される。このテーブルがすでに存在する場合(例えば、使用中 read データファイルを読み込むためには、新しいテーブルを作成する必要があります:

>> dat = Table.read('data.fits')
>> dat = Table(dat, masked=True, copy=False)  # Convert to masked table
>> dat['new_column'] = [1, 2, 3, 4, 5]  # Will be added as a MaskedColumn

ほとんどのアプリケーションにとって、これは必要ではないはずですが、第一選択の習慣の使い方は、次のより明確なバージョンです。

>> dat = Table.read('data.fits')
>> dat['new_column'] = np.ma.MaskedArray([1, 2, 3, 4, 5])