NumPyで条件分岐!np.whereで配列を効率的に操作する方法
NumPyでデータ処理を行う際、特定の条件を満たす要素だけを抽出したり、値を置き換えたりする場面はよくあります。Pythonの標準的なif/else文をループで使うと処理が遅くなりがちですが、NumPyの**np.where**関数を使えば、この条件分岐処理を高速かつ効率的に行えます。この記事では、np.whereの基本的な使い方から応用例まで、サンプルコードを交えながら詳しく解説します。
np.whereとは?
np.whereは、指定した条件に基づいて、NumPy配列の要素を選択的に操作するための関数です。条件が真(True)の場所にはある値を、偽(False)の場所には別の値を割り当てることができます。これは、ExcelのIF関数やSQLのCASE文に似た機能で、配列全体にわたる条件付き操作をベクトル化して高速に実行できるのが特徴です。
書式
numpy.where(condition[, x, y])
-
condition: 条件を評価するための真偽値配列(ブール配列)。 -
x(オプション):conditionがTrueの場所に適用される値。 -
y(オプション):conditionがFalseの場所に適用される値。
ポイント: xとyを省略した場合、np.whereはconditionがTrueの場所のインデックス(座標)を返します。
np.whereの基本的な使い方
1. 条件を満たす要素のインデックスを取得する
xとyを省略すると、np.whereは条件がTrueとなる要素のインデックスを返します。多次元配列の場合、各次元のインデックスがタプルとして返されます。
サンプルコード
import numpy as np
arr = np.array([10, -5, 20, -15, 30])
# arr > 0 の条件を満たすインデックスを取得
indices = np.where(arr > 0)
print("条件を満たすインデックス:", indices)
print("元の配列で条件を満たす値:", arr[indices])
出力例
条件を満たすインデックス: (array([0, 2, 4]),)
元の配列で条件を満たす値: [10 20 30]
2. 条件に応じて値を置き換える
xとyを指定することで、条件に応じて配列の要素を置き換えることができます。
サンプルコード
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
# arrが3より大きい場合は99、そうでない場合は0に置き換える
result_arr = np.where(arr > 3, 99, 0)
print("条件による値の置換:", result_arr)
出力例
条件による値の置換: [ 0 0 0 99 99]
np.whereの応用例
1. 複数の配列から条件に基づいて値を選択する
np.whereは、3つの配列(条件、Trueの場合の配列、Falseの場合の配列)を使って、条件に応じて異なる配列の要素を選択する際にも利用できます。
サンプルコード
import numpy as np
arr1 = np.array([10, 20, 30, 40, 50])
arr2 = np.array([1, 2, 3, 4, 5])
condition = arr1 > 30
# arr1 > 30 なら arr1の値、そうでなければ arr2の値
result = np.where(condition, arr1, arr2)
print("複数の配列からの選択:", result)
出力例
複数の配列からの選択: [ 1 2 3 40 50]
2. 特定の範囲外の値を処理する
例えば、データの外れ値を特定の閾値に丸めるといった処理にも活用できます。
サンプルコード
import numpy as np
data = np.array([5, 12, 98, 3, 150, 70])
lower_bound = 10
upper_bound = 100
# 10未満は10、100超は100に、それ以外は元の値
clipped_data = np.where(data < lower_bound, lower_bound,
np.where(data > upper_bound, upper_bound, data))
print("範囲外の値を丸める:", clipped_data)
出力例
範囲外の値を丸める: [ 10 12 100 10 100 70]
まとめ
np.whereは、NumPy配列に対する条件付き操作を効率的かつ高速に行うための強力なツールです。Pythonのループ処理ではパフォーマンスが問題になるような大規模データセットに対しても、ベクトル化された処理によって高速な計算を実現します。
-
条件を満たす要素のインデックス取得
-
条件に応じた値の置き換え
-
複数の配列からの条件付き選択
-
データのクリッピング(範囲外の値の処理)
これらの機能を理解し使いこなすことで、NumPyでのデータ分析や数値計算がよりスムーズになるでしょう。ぜひ、あなたのコードに取り入れてみてください!🚀

