基本形
ndarrayの要素に以下のような条件式を指定すると、条件に適合した要素を取り出せる。
1 2 3 4 |
a = np.array([0, 1, 2, 3, 4, 5]) print(a[a%2==0]) # [0 2 4] |
これは次のような仕組みになっている。
まず配列の要素として、要素数と同数の論理値(True/False
)を格納した配列を指定すると、True
に対応した要素のみを要素とする配列が返される。
1 2 3 4 |
a = np.array([0, 1, 2, 3, 4, 5]) print(a[[False, True, True, False, True, False]]) # [1 2 4] |
一方、配列全体を条件式とすると、各要素について条件判定を行った結果(True/False
)を要素とする配列が返される。
1 2 3 4 |
a = np.array([0, 1, 2, 3, 4, 5]) print(a%2==0) # [ True False True False True False] |
したがって、配列の要素に配列全体の条件式を適用すると、その条件判定がTrueとなる要素からなる配列が返される。
別配列の条件による取り出し
条件に合う行の取り出し
上記の応用で、以下のように配列a
の要素を配列b
の条件により取り出すことができる。
1 2 3 4 5 |
a = np.array([0, 1, 2, 3, 4, 5]) b = np.array([0, 1, 1, 0, 1, 0]) print(a[b==1]) # [1 2 4] |
この方法は、元データからクラス分類に応じたデータのみを取り出すときなどに使える。
たとえば以下は、5組の座標値のセットX
から、クラスy
が1となる座標値のサブセットを取り出すイメージ。
1 2 3 4 5 6 7 8 9 10 11 12 |
X = np.array([ [0, 1], [2, 3], [4, 5], [6, 7], [8, 9]]) y = np.array([0, 1, 1, 0, 1]) print(X[y==1]) # [[2 3] # [4 5] # [8 9]] |
条件に合う列の取り出し
条件に適合した列のみ取り出す場合には、少し工夫が必要で、内包表記と条件指定を組み合わせる。
以下の例では、配列yで抽出したい列を1としていて、内包表記で配列を取り出す際にこれを利用している。
1 2 3 4 5 6 7 8 9 10 |
X = np.array([ [0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]) y = np.array([0, 1, 1, 0]) print(np.array([r[y==1] for r in X])) # [[ 1 2] # [ 5 6] # [ 9 10]] |