HOWTO · NumPy

numpy.where() で複数の条件を指定する

Python の numpy.where() で複数の条件を指定する方法を、& 演算子、| 演算子、numpy.logical_and()、numpy.logical_or() を使った例とともに紹介します。

このページの内容

配列の比較結果は要素ごとの真偽値配列になります。これらの配列は & や |、または numpy.logical_and() や numpy.logical_or() で組み合わせ、その結果を numpy.where() に渡して条件に合う要素を選択できます。& と | を使う場合は、各比較式を括弧で囲んでください。以下では、2 より大きく 4 より小さい値を選ぶ方法と、2 より大きいか 2 で割り切れる値を選ぶ方法を示します。すべての条件を満たす必要があるときは AND、いずれかを満たせばよいときは OR を使います。各比較式は values の各要素に対応する真偽値配列を作り、それらを組み合わせた配列が選択条件になります。

各例では選択された値を表示します。出力はコードの直後に示します。

& 演算子で numpy.where() に複数の条件を指定する

配列の各要素についてすべての比較条件が真であることを求めるには、& を使います。Python の演算子の優先順位によって意図しない順序で評価されることがあるため、各比較式を括弧で囲みます。次の例では、2 より大きく 4 より小さい値を選択します。端点の 2 と 4 は含まれません。

import numpy as np

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

result = values[np.where((values > 2) & (values < 4))]
print(result)
[3]

np.where(condition) は条件に一致するインデックスのタプルを返します。そのタプルで values をインデックス指定すると、該当する要素を取得できます。この例では値 3 が選択されます。条件を追加する場合は、各比較式を括弧で囲んで、さらに & でつなぎます。つないだ条件がすべて真となる要素だけが結果に残ります。

| 演算子で numpy.where() に複数の条件を指定する

比較条件のどちらか一方が真であればよい場合は、| を使います。NumPy の条件式では | が要素ごとの OR 演算を行い、2 つの比較結果の対応する真偽値を組み合わせます。次の例では、2 より大きい値、または 2 で割り切れる値を選びます。要素ごとの OR 演算の前に、それぞれの比較式を括弧で囲んでいます。

import numpy as np

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

result = values[np.where((values > 2) | (values % 2 == 0))]
print(result)
[2 3 4 5]

値 2 は割り切れる条件を満たし、3 と 5 は 2 より大きい条件を満たします。4 は両方の条件を満たします。numpy.where() は一致する各インデックスを一度だけ返すため、選択結果の 4 は重複しません。複数の条件のうちどれか一つを満たせばよい場合は、括弧で囲んだ比較式をさらに | でつなげられます。

numpy.logical_and() 関数で numpy.where() に複数の条件を指定する

numpy.logical_and() は 2 つの条件を要素ごとに組み合わせます。& を使う方法を関数で表したものです。その結果を numpy.where() に渡して一致するインデックスを取得し、返されたインデックスで値を選択します。

import numpy as np

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

condition = np.logical_and(values > 2, values < 4)
result = values[np.where(condition)]
print(result)
[3]

この例では、要素を選ぶには両方の比較条件が真でなければなりません。入力の形状が同じ場合、条件配列も values と同じ形状になります。条件を追加するときは、論理関数の結果を段階的に組み合わせると、長い条件を読みやすく確認しやすくできます。

Python で numpy.logical_or() 関数を使って numpy.where() に複数の条件を指定する

numpy.logical_or() は、どちらか一方の条件を満たす要素を選べるように、条件を要素ごとに組み合わせます。演算子を使う例と同様に、ここでは 2 より大きい値、または 2 で割り切れる値を選択します。

import numpy as np

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

condition = np.logical_or(values > 2, values % 2 == 0)
result = values[np.where(condition)]
print(result)
[2 3 4 5]

配列を要素ごとに処理するときは & と | を使います。Python のスカラー演算子 and と or は NumPy の真偽値配列を組み合わせるものではありません。名前付きの演算を使いたい場合や、条件を段階的に組み立てたい場合は論理関数が便利です。形状に互換性のある条件では、NumPy の論理関数が要素ごとに演算します。各例の values[np.where(condition)] は返されたインデックスタプルを使って元の値を取得します。np.where(condition) だけでは位置が返され、その位置にある値そのものは返されません。条件配列の形状が、選択対象のデータと互換性があることを確認してください。