0

でこぼこしたマスクされたデータの配列があります:

data = masked_array(data = [7 -- 7 1 8 -- 1 1 -- -- 3 -- -- 3 --],
                    mask = [False True False False False True False False True True False True True False True])

ブール値のマスクされた配列である特定のタイプのデータのフラグがあります。

flag = masked_array(data = [True False False True -- -- -- False -- True -- -- -- -- True],
                    mask = [False False False False True True True False True False True True True True False])

data[flag]私は次のようなことをして、次の出力を得たいと思っています:

output_wanted = [7 1 -- --]

これは、フラグが True であるデータ要素に対応します。代わりにこれを取得します:

output_real = [7 -- 7 1 8 -- 1 1 -- -- 3 -- -- 3 --]

わかりやすくするために、出力のマスクをコピーしませんでした。

必要なデータ (フラグの True 値に対応するデータ) を選択する限り、フラグのサイズの出力を使用してもかまいません。しかし、実際の出力でこれらの値が得られる理由がわかりません!

4

3 に答える 3

2

次のようなものはどうですか:

import numpy as np
from numpy.ma import masked_array

data = masked_array(data = [7,     0,     7,     1,     8,     0,    1,     1,     0,    0,     3,     0,    0,    3,     0],
                    mask = [False, True,  False, False, False, True, False, False, True, True,  False, True, True, False, True])
flag = masked_array(data = [True,  False, False, True,  0,     0,    0,     False, 0,    True,  0,     0,    0,    0,     True],
                    mask = [False, False, False, False, True,  True, True,  False, True, False, True,  True, True, True,  False])

print(repr(data))
print(repr(flag))

indices = np.where(flag & ~flag.mask)
print(data[indices])

のマスクされた値をflagと比較できない場合、問題が発生する可能性があります&が、そうではないようです。

出力:

masked_array(data = [7 -- 7 1 8 -- 1 1 -- -- 3 -- -- 3 --],
             mask = [False True False False False True False False True True False True True False True],
       塗りつぶし値 = 999999)

masked_array(data = [1 0 0 1 -- -- -- 0 -- 1 -- -- -- -- 1],
             mask = [False False False False True True True False True False True True True True False],
       塗りつぶし値 = 999999)

[7 1 -- --]

編集:

インデックスを取得する別の方法としては、次のようなものもあります。

indices = np.where(flag.filled(False))

更新 (編集 2):

配列を使用した配列のインデックス付けの微妙な点に注意してください。

次のコードを検討してください。

import numpy as np

data = np.array([1,2,3,4,5])
mask = np.array([True, False, True, False, True])

res  = data[mask]
print(res)

ご想像のとおり (またはそうでないかもしれません)、ここでは、マスクは "フィルター" として機能し、マスク内の対応する位置が False であるデータの要素を除外します。dataとに選択した値のおかげでmask、インデックス付けによって偶数の値が除外されdata、奇数の値だけが残ります。

ここでの出力は次のとおり[1 3 5]です。

ここで、非常によく似たコードを考えてみましょう:

import numpy as np

data = np.array([1,2,3,4,5])
mask = np.array([1, 0, 1, 0, 1])

res  = data[mask]
print(res)

ここで変更されたのは、マスク要素のデータ型だけで、ブール値は同じです。True最初のマスク ( /のFalse値で構成される)mask1と 2 番目のマスク ( 1/の0値で構成される)を呼び出しましょうmask2

属性を介して配列のデータ型を調べることができdtypeます (例: print(mask.dtype))。 mask1の dtype をbool持ちmask2、 の dtype を持ちint32ます。

ただし、ここでは出力が異なります: [2 1 2 1 2] .

何が起きてる?

実際、インデックス付けは、インデックス付けに使用される配列のデータ型に応じて異なる動作をします。前述のように、「マスク」のデータ型がブール値の場合、フィルタリング機能を提供します。しかし、「マスク」のデータ型が整数の場合、元の配列のインデックスとしてインデックスの要素を使用して、「選択」機能を提供します。

したがって、2 番目の例では、data[1] = 2anddata[0] = 1であるため、 の結果はdata[mask2]長さ 3 ではなく 5 の配列になります (ブール値の場合)。

別の言い方をすると、次のコードが与えられます。

res = data[mask]

の場合mask.dtype == int、res の長さは mask の長さと等しくなります。

の場合、res の長さはmaskmask.dtype == boolの値の数と等しくなります。True

かなりの違い。

最後に、メソッドを使用して、あるデータ型の配列を別のデータ型に強制変換できますastype

デモンストレーション スニペット:

import numpy as np

data = np.array([1,2,3,4,5])

# Create a boolean mask
mask1 = np.array([True, False, True, False, True])

# Create an integer "mask", using the same logical values 
mask2 = np.array([1,0,1,0,1])

# Coerce mask2 into a boolean mask
mask3 = mask2.astype(bool)

print(data)         # [1 2 3 4 5]
print("-" * 80)
print(mask1)        # [True  False  True  False  True]
print(mask1.dtype)  # bool
print(data[mask1])  # [1 3 5]
print("-" * 80)
print(mask2)        # [1 0 1 0 1]
print(mask2.dtype)  # int32
print(data[mask2])  # [2 1 2 1 2]
print("-" * 80)
print(mask3)        # [True  False  True  False  True]
print(mask3.dtype)  # bool
print(data[mask3])  # [1 3 5]
于 2016-07-19T10:17:25.400 に答える
0

マスクされた配列を使用したインデックス付けがどのように機能するかを理解しました。

実際、python はこの種の索引付けを扱いません。

ブール値のマスクされた配列を使用して何かを行う場合data[flag]flagpython は の基になるデータを取得しflagます。つまり、マスクされる前にマスクされた値の値を取ります。

したがって、注意してください: マスクされた値が明示的に で埋められていない場合fill_value、インデックスはランダムに見える可能性があります。

例:

>>> arr = np.array([0, 1, 2, 3, 4])
>>> flag = np.ma.masked_array([True, False, False, True, True],
                              [False, True, False, False, True])

>>> arr[flag])
array([0, 3, 4])

それを行う1つの方法は、ジェドワーズの答えのようなものです。

しかし、データにフラグを付けるためにマスクされた配列を避けるべきだと思います。それは十分な洞察をもたらしません。

特定のタイプのデータにアクセスするために使用されるフラグ配列の場合、マスクされた値を に設定する必要がありますFalse。たとえば、フラグが立てられていないデータを補間したい場合。

フラグ配列を使用して特定のタイプのデータをマスクする場合、マスクされた値を True に設定する必要があります。

于 2016-07-19T12:29:11.890 に答える