NumPy中級③:条件抽出と論理演算|配列を自在にフィルタリングする

はじめに

データ分析において「特定の条件に合うデータだけを取り出す」という処理は非常に頻繁に発生します。これを効率よく行うための機能が、NumPyの「条件抽出(Boolean indexing)」と「論理演算」です。

Pythonの基本構文でも forif を使って条件付きの抽出は可能ですが、NumPyではより高速かつ簡潔に、しかも大量データに対しても処理できるのが特徴です。

本記事では、論理演算子の使い方から、条件の組み合わせ、複数条件の抽出、ブール配列を使ったフィルタリングまで、実例を交えてわかりやすく解説します。


配列に対する条件判定の基本

スカラーとの比較

NumPy配列に対してスカラー(1つの数値)を使った比較をすると、各要素ごとの結果がTrue/Falseで返される配列になります。

import numpy as np
arr = np.array([10, 20, 30, 40, 50])
print(arr > 25)
# [False False  True  True  True]

このように、条件に合うかどうかを要素単位で一括処理できます。


条件に合う要素だけを抽出する

Boolean配列を使ったフィルタリング

比較演算の結果はTrue/Falseの配列になります。それをそのままインデックスに使うことで、条件を満たす要素だけを取り出せます。

arr = np.array([10, 20, 30, 40, 50])
condition = arr > 25
print(arr[condition])  # [30 40 50]

もちろん、これを1行で書くこともできます:

print(arr[arr > 25])

複数の条件を組み合わせる

AND(かつ)条件

Pythonの論理演算子 and は配列には使えません。代わりに & を使います。

arr = np.array([10, 20, 30, 40, 50])
print(arr[(arr > 15) & (arr < 45)])  # [20 30 40]

OR(または)条件

or の代わりに | を使います。

print(arr[(arr < 25) | (arr > 45)])  # [10 20 50]

NOT(否定)

~ を使えば、条件を否定できます。

print(arr[~(arr > 25)])  # [10 20 25]

⚠ 条件式はそれぞれ 丸括弧()で囲む 必要があります。そうしないと構文エラーになります。


条件抽出の応用テクニック

配列の値を置換する(where)

arr = np.array([10, 20, 30, 40, 50])
print(np.where(arr > 30, 1, 0))  # [0 0 0 1 1]

これは条件を満たす部分を1に、それ以外を0に置き換える例です。マスク処理や分類ラベルの変換などで使えます。

条件に合うインデックスを取得する(nonzero, where)

arr = np.array([5, 10, 0, -3, 8])
print(np.where(arr > 0))  # (array([0, 1, 4]),)

インデックスが返るので、後で arr[インデックス] で取り出せます。


よくあるエラーと注意点

& や | を使うときに()を忘れる

# 間違い(構文エラー)
# arr[arr > 10 & arr < 30]

# 正しい
arr[(arr > 10) & (arr < 30)]

bool配列の長さが違う

ブール配列を使ってフィルタするとき、元の配列と形状が一致していないとエラーになります。

arr = np.array([1, 2, 3])
cond = np.array([True, False])
print(arr[cond])  # → エラー!

おわりに

NumPyの条件抽出と論理演算を使えば、複雑な「データのふるい分け」もシンプルに記述でき、処理速度も高速です。

今回紹介した基本操作に慣れておくことで、実務におけるデータ前処理や統計的な分析作業が格段に効率化されます。

次回は、NumPyにおける「乱数生成とシミュレーション」について解説します。

✅ NumPy中級シリーズ:目次リンク

🔹 NumPy中級シリーズ一覧(基礎〜応用)

  1. 【中級①】配列操作の基本と応用|reshape・axis・スライスをマスター
     ↳ NumPy中級①:配列操作の基本と応用|reshape・axis・スライスをマスター
  2. 【中級②】ブロードキャストと演算の仕組みを徹底解説
     ↳ NumPy中級②:ブロードキャストと演算の仕組みを徹底解説
  3. 【中級③】条件抽出と論理演算|配列を自在にフィルタリングする
     ↳ NumPy中級③:条件抽出と論理演算|配列を自在にフィルタリングする
  4. 【中級④】乱数生成とシミュレーション|再現性と統計処理の基礎
     ↳ NumPy中級④:乱数生成とシミュレーション|再現性と統計処理の基本
  5. 【中級⑤】応用編:np.where, np.select, np.any, np.allの便利な使い方
     ↳ NumPy中級⑤:便利関数大全|np.where, np.any, np.all, np.select を使いこなす

コメント

タイトルとURLをコピーしました