次のようなものはどうですか:
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] = 2
anddata[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]