ビットマスクおよびマスク配列を処理するためのユーティリティ関数

これは一般的な使用です bit fields 例えば、単一のビットは、データ状態を特徴付けるために、いくつかの属性の整数変数を表す。例えば、ハッブル宇宙望遠鏡(HST)は、HST画像のデータ品質(DQ)を特徴付けるためにビットドメインアレイを使用する。例えば、以下のDQフィールド値を参照してください WFPC2 image data (see Table 3.3) そして WFC3 image data (see Table 3.3) それがそうです。ご覧のように様々な ビットマーク. この2つの楽器は大体違うからです

ビットフィールドは、緊密にカプセル化されたビットフラグのセットと考えることができる。Vbl.使用 masking 個々のビットの状態を“チェック”することができる.

ビットフィールド配列に対して実行される一般的な動作の1つは、例えばブール値をブール値にすることによって、ブーリアンマスクに変換することである。 True (ブールマスクでは)非ゼロ値ビット領域(少なくとも1ビットが設定されたビット領域)に対応する要素まで 1 )または一般的に True その対応するビットフィールドまでは 特定フィールド. (設定を)に設定する 1 )である。ビットフィールドのこのようなより複雑な分析は使用することができる ビットマスク そして先に述べた覆面行動。

♪the bitmask モジュールは、ビット領域配列(すなわち、DQ配列)のブーリアンマスクへの変換を容易にする2つの関数を提供する。 bitfield_to_boolean_mask 入力ビット領域配列は、入力ビットマスク(または単一のビットフラグリスト)を使用してブールマスクに変換される interpret_bit_flags ビットマスクは、単一のビットフラグの入力リストから作成される。

ブールマスクの作成

概要

bitfield_to_boolean_mask デフォルトの場合、少なくとも1ビット開いているすべての入力ビット領域が“悪い”データ(すなわち画素)に対応すると仮定し、それらをブール値に変換する。 True 出力ブールマスクでは(そうでなければ出力ブールマスク値は False )。

一般に、特定のアルゴリズムおよび場合には、いくつかのビットフラグは無視することができる。 bitfield_to_boolean_mask 以下の条件を満たすビットフラグリストを受け取る: デフォルトの場合は無視しなければならない ブーリアンマスクを作成する際の入力ビットフィールドに。

Fundamentally, by default, bitfield_to_boolean_mask performs the following operation:

(1)    boolean_mask = (bitfield & ~bit_mask) != 0

(ここだ) & 順番です。 and 同時に…。 ~ 順番です。 not 操作する。)前の式では bit_mask ビットフィールド内で無視される必要がある各ビットフラグから生成されるビットマスクである。

例を引く

表1:ブーリアンマスク計算例(デフォルトパラメータおよび8ビットデータタイプ)

位字段

ビットマスク

~(ビットマスク)

ビットドメイン&~(ビットマスク)

ブールマスク

11011001(217)

01010000(80)

10101111(175)

1000 1001(137.)

本当です。

11011001(217)

10101111(175)

01010000(80)

01010000(80)

本当です。

00001001(9)

01001001(73)

10110110(182)

0(0)

誤り.

00001001(9)

0(0)

1111111(255)

00001001(9)

本当です。

00001001(9)

1111111(255)

0(0)

0(0)

誤り.

位置標識を指す

bitfield_to_boolean_mask 整数ビットマスクまたはビットフラグリストを受け入れる。ビットフラグリストは、ビットマスクに統合され、Pythonリストとして提供されます。 整数ビットフラグ値 コンマとして分離する(または + 分離)整数ビットフラグ値のリスト。第1の例におけるビットマスク Table 1 それがそうです。このような場合には ignore_flags 設定することができます

  • 整数値ビットマスク80

  • 単一の非ゼロ値を示すPythonリスト ビットフラグ値: [16, 64]

  • A string of comma-separated bit flag values or mnemonic names: '16,64', 'CR,WARM'

  • A string of +-separated bit flag values or mnemonic names: '16+64', 'CR+WARM'

例を引く

位置マークを指すには、以下の操作を実行してください。

>>> from astropy.nddata import bitmask
>>> import numpy as np
>>> bitmask.bitfield_to_boolean_mask(217, ignore_flags=80)
array(True...)
>>> bitmask.bitfield_to_boolean_mask(217, ignore_flags='16,64')
array(True...)
>>> bitmask.bitfield_to_boolean_mask(217, ignore_flags=[16, 64])
array(True...)
>>> bitmask.bitfield_to_boolean_mask(9, ignore_flags=[1, 8, 64])
array(False...)
>>> bitmask.bitfield_to_boolean_mask([9, 10, 73, 217], ignore_flags='1,8,64')
array([False,  True, False,  True]...)

出力マスクのタイプを指定することもできる:

>>> bitmask.bitfield_to_boolean_mask([9, 10, 73, 217], ignore_flags='1,8,64', dtype=np.uint8)
array([0, 1, 0, 1], dtype=uint8)

助記ビット·フラグ名リストを使用するためには、マッピング、すなわちマッピングを提供する必要がある BitFlagNameMap これは、フラグ名を所定のフラグ値にマッピングするために使用されてもよい。一般に、これらの地図は、特定の機器をサポートする第三者ソフトウェアパッケージによって提供されるべきである。マッピング内の各ビットフラグはまた、フラグ値の後に文字列注釈を含むことができる。以下の例では、簡単なマスクマップを定義する。

>>> from astropy.nddata.bitmask import BitFlagNameMap
>>> class ST_DQ(BitFlagNameMap):
...     CR = 1
...     CLOUDY = 4
...     RAINY = 8, 'Dome closed'
...     HOT = 32
...     DEAD = 64
>>> bitmask.bitfield_to_boolean_mask([9, 10, 73, 217], ignore_flags='CR,RAINY,DEAD',
...                                  dtype=np.uint8, flag_name_map=ST_DQ)
array([0, 1, 0, 1], dtype=uint8)

ビット·フラグを使用した名前マッピング

作成中の助記ビットフラグ名の使用を可能にするために ブル型. マスクは,ビットフラグ名マッピングを用いる.これらのマッピングは、対応する整数値への助記ビットフラグ名のサイズを区別しない変換を実行する。

ビットフラグ名マッピングは BitFlagNameMap 2つの方法で構成したり直接サブクラス化したりすることができます BitFlagNameMap 例えば、

>>> from astropy.nddata.bitmask import BitFlagNameMap
>>> class ST_DQ(BitFlagNameMap):
...     CR = 1
...     CLOUDY = 4
...     RAINY = 8
...
>>> class ST_CAM1_DQ(ST_DQ):
...     HOT = 16
...     DEAD = 32

または使用する extend_bit_flag_map 類工場:

>>> from astropy.nddata.bitmask import extend_bit_flag_map
>>> ST_DQ = extend_bit_flag_map('ST_DQ', CR=1, CLOUDY=4, RAINY=8)
>>> ST_CAM1_DQ = extend_bit_flag_map('ST_CAM1_DQ', ST_DQ, HOT=16, DEAD=32)

注釈

ビットフラグ値は、2の累乗の整数でなければならない。

構築されると,マッピングのビットフラグ値は修正,削除,追加できない.上に示した2つの方法のうちの1つのサブクラス化を使用することによって、または以下の形態のタプルリストを追加することによって、地図にフラグを追加することしかできない ('NAME', value) クラス全員に。これは、元の地図に基づくサブクラスを作成しますが、付加的なマークを含む新しい地図クラスを作成します。

>>> ST_CAM1_DQ = ST_DQ + [('HOT', 16), ('DEAD', 32)]

上述したサブクラス化またはクラス工場例と同じマッピングが生成される。

ビットフラグ名マッピングを作成した後、以下のようにビットフラグ値にアクセスすることができます case-insensitive 辞書のクラス属性またはキー:

>>> ST_CAM1_DQ.cloudy
4
>>> ST_CAM1_DQ['Rainy']
8

ブーリアンマスクを作成するための式を修正する

bitfield_to_boolean_mask ブーリアンマスクを作成するための式を修正するために使用することができるいくつかのパラメータが提供される。

逆位相マスク

時々、より便利なのは、それらのビットマーク、これらのビットマークを指定することができます。 考えなければならない ブールマスクを作成する際には,他のすべてのフラグを無視すべきである.

例を引く

はい。 bitfield_to_boolean_mask specifying bit flags that must be considered when creating the boolean mask can be accomplished by setting the parameter flip_bits to True. This effectively modifies equation (1) 致す:

(2)    boolean_mask = (bitfield & bit_mask) != 0

そのためというよりは

>>> bitmask.bitfield_to_boolean_mask([9, 10, 73, 217], ignore_flags=[1, 8, 64])
array([False,  True, False,  True]...)

以下と同様の結果が得られます。

>>> bitmask.bitfield_to_boolean_mask(
...     [9, 10, 73, 217], ignore_flags=[2, 4, 16, 32, 128], flip_bits=True
... )
array([False,  True, False,  True]...)

しかし注意してください ignore_flags コンマで区切られたビットフラグ値リストです flip_bits 設定できません True あるいは…。 False それがそうです。逆に,コンマで区切られたビットフラグ値の文字列リストからなるビットマスクのビットを反転させるためには,前に単一を加えることができる. ~ リストにあります

>>> bitmask.bitfield_to_boolean_mask([9, 10, 73, 217], ignore_flags='~2+4+16+32+128')
array([False,  True, False,  True]...)

反転ブーリアンマスク

他の場合、逆マスクが得られ、マスクにマークされたデータが変換されることがより便利である可能性がある。 False ではなく True

(3)    boolean_mask = (bitfield & ~bit_mask) == 0

これは変更することで good_mask_value パラメータはそのデフォルト値から (False )から True それがそうです。

例を引く

反転マスクを取得し,そのマスクにマークされたデータを変換する. False ではなく True

>>> bitmask.bitfield_to_boolean_mask([9, 10, 73, 217], ignore_flags=[1, 8, 64],
...                                  good_mask_value=True)
array([ True, False,  True, False]...)