NumPyのndarrayは、np.where
関数に条件式を指定することで、目的の要素のインデックスを取得することができます。
ヒストグラムのインデックスを取得したいときや、しきい値を設けて値を制限したいときなどに便利なので、覚えておくと役に立つはずです。
np.where
np.where
は、条件を満たす要素のインデックスを返す関数です。APIドキュメントは以下のようになっています。
numpy.where(condition[, x, y])
params:
パラメータ名 |
型 |
概要 |
condition |
array_like (配列に相当するもの) もしくは bool値 |
条件もしくはbool値を指定します。 |
x, y |
array_like (配列に相当するもの) |
(省略可能)
condition で指定された条件に対してTrueならx を、Falseならy を返します。x, y のshape は元の配列と揃えるようにしましょう。 (これは任意入力ですがどちらも指定する必要があります) |
returns:
抽出されたndarrayの要素のindexが返されます。元のndarrayが二次元のときは次元ごとのindexが記された一次元配列が2つ返されます。
x, y
が指定されていれば、要素がx
またはy
に変換されたndarrayが返されます。
arr[a < 10]
のように、インデックス部分に条件を指定することで、目的の要素を取得することができました。np.where
を使うことで、値ではなくインデックスを取得することができます。
条件の指定
基本的な使い方は、第一引数に条件のみを指定する方法です。以下のように第一引数に条件式を指定することで、条件を満たす要素のインデックスを取得することができます。
続いて多次元配列でも試してみます。
一瞬困惑するかもしれませんが、同様にインデックスが取得されています。上記の例では、行と列のインデックスが取り出されており、対応する(0, 0)や(0, 2)は偶数になっていることが分かります。
np.whereを使った三項演算子
np.where
はプログラムの三項演算子のような使い方ができます。
第一引数に抽出したい要素の条件を指定し、第二引数以降で条件を満たすとき値と満たさないときの値を指定することができます。
x, y
を上手く使うことで、配列の一部の要素だけ変換したいときに便利になります。
条件のあとに条件を満たす場合と満たさない場合にどのような値を返すか指定しておけば、その値を要素とする新しい配列を返します。
最後にbroadcastingを紹介します。最後の引数に、配列やタプルのようなイテレーション可能な値を指定すると、繰り返したときにインデックスアクセスしたときの値が使用されます。