Pythonでデータ分析や科学計算を行う際、**データの一部を条件に応じて抽出する(フィルタリング)**作業はとても重要です。NumPyには、こうした処理を効率的に行う機能が備わっています。
この記事では、NumPyを使って 特定の条件に合う要素だけを取り出す方法を、初心者の方にも分かりやすく解説します。
この記事の対象
基本:条件に合う要素だけを取り出す
まずは、配列の中から「3より大きい要素」を取り出す例を見てみましょう。
import numpy as np
data = np.array([1, 2, 3, 4, 5])
# 条件を定義
condition = data > 3
# 条件に合致するデータを抽出
filtered_data = data[condition]
print("元のデータ:", data)
print("3より大きいデータ:", filtered_data)
結果
元のデータ: [1 2 3 4 5]
3より大きいデータ: [4 5]
解説
data > 3
は、条件に合う要素だけTrue
になる「ブール配列」を作ります。- そのブール配列を使って、元のデータから該当する要素を抽出しています。
複数条件を組み合わせて選択する
より複雑な条件を扱う場合、条件を組み合わせてデータをフィルタリングすることがあります。NumPyでは、論理演算子(&
、|
、~
)を使用して条件を組み合わせることができます。
「2より大きく、かつ偶数の要素」だけを抽出してみましょう。
import numpy as np
data = np.array([1, 2, 3, 4, 5])
# 2より大きい AND 偶数 の条件
condition = (data > 2) & (data % 2 == 0)
filtered_data = data[condition]
print("複数条件に合うデータ:", filtered_data)
この例では、「2より大きく、かつ偶数の要素」を選択しています。
結果
複数条件に合うデータ: [4]
解説
&
は論理積(AND)を意味します- 条件式は カッコで囲む必要があるので注意してください
応用:欠損値(NaN)を除外する
NumPyでは、np.isnan()
を使って NaN を判別できます。
import numpy as np
data = np.array([1, np.nan, 2, np.nan, 3])
filtered_data = data[~np.isnan(data)]
print("NaNを除いたデータ:", filtered_data)
結果
NaNを除いたデータ: [1. 2. 3.]
小数の比較:許容誤差を使う
小数の誤差を考慮した比較では np.isclose()
を使うと便利です。
import numpy as np
a = np.array([1.0000001, 2.0, 3.0])
b = np.array([1.0, 2.0, 3.0])
print(np.isclose(a, b))
結果
[ True True True]
効率的にインデックスを取得する:np.where
条件に合う「インデックス」を取り出すには np.where()
が使えます。
import numpy as np
data = np.array([1, 2, 3, 4, 5])
indices = np.where(data > 3)
print("3より大きい要素のインデックス:", indices)
print("該当データ:", data[indices])
結果
3より大きい要素のインデックス: (array([3, 4], dtype=int64),)
該当データ: [4 5]
まとめ
やりたいこと | 方法 |
---|---|
単一条件で抽出 | data[data > 3] |
複数条件で抽出 | (data > 2) & (data % 2 == 0) |
NaNの除去 | ~np.isnan(data) |
小数の誤差を考慮 | np.isclose(a, b) |
条件の位置取得 | np.where(data > x) |
初心者向け補足
- NumPyは配列操作に特化した高速ライブラリなので、Pythonのfor文よりも効率的です。
- データ前処理(クリーニング)ではフィルタ処理が必須です。
- 複雑な条件式ほど、カッコの使い方に注意!