2
1

numpy.isin でデータを一気にフィルタリングする方法

Last updated at Posted at 2024-07-24

はじめに

numpyライブラリのnp.isin について、詳細はご本家のマニュアルがありますが、

使いなれるために具体例を紹介したいと思います。

Python の np.isin を使って一気にフィルタリング!

Pythonでデータのフィルタリングを行う際に便利な関数の一つに、numpyライブラリのnp.isinがあります。この記事では、このnp.isin関数の使い方を具体例を交えて解説します。また、フィルタリング前後のデータを可視化する方法についても紹介します。

np.isinとは?

np.isinは、ある配列の要素が別の配列に含まれているかどうかをチェックし、その結果をブール値の配列で返す関数です。これを使うことで、特定の条件に基づいたデータのフィルタリングが簡単に行えます。

np.isinの簡単な具体例

まずは、np.isinの基本的な使い方を見てみましょう。

import numpy as np

# サンプルデータの生成
array = np.array([1, 2, 3, 4, 5])
values_to_check = [2, 4]

# np.isinを使用して値をチェック
result = np.isin(array, values_to_check)

print("Array:", array)
print("Values to check:", values_to_check)
print("Result:", result)

このコードを実行すると、次のような結果が得られます。

Array: [1 2 3 4 5]
Values to check: [2, 4]
Result: [False  True False  True False]

ここでは、arrayの要素がvalues_to_checkに含まれているかどうかをチェックし、その結果がブール値の配列で返されています。Trueはその要素がvalues_to_checkに含まれていることを示し、Falseは含まれていないことを示します。

invert=Trueを使った逆論理の具体例

np.isinにはinvert=Trueオプションを指定することができます。これにより、指定した値に含まれない要素を選択することができます。

# np.isinを使用して逆論理で値をチェック
result_inverted = np.isin(array, values_to_check, invert=True)

print("Array:", array)
print("Values to check:", values_to_check)
print("Inverted result:", result_inverted)

このコードを実行すると、次のような結果が得られます。

Array: [1 2 3 4 5]
Values to check: [2, 4]
Inverted result: [ True False  True False  True]

ここでは、arrayの要素がvalues_to_checkに含まれていないかどうかをチェックし、その結果がブール値の配列で返されています。

サンプルデータの生成

次に、より実践的な例として、4つのカラムを持つデータを生成します。今回使用するデータは、次の4つのカラムを持つデータです:

  • pixel: 0から35の整数
  • itype: 0から5の整数
  • time: 単調増加の正実数
  • energy: 0から10000の整数

以下のコードでサンプルデータを生成します。

import numpy as np

# データの生成
np.random.seed(42)  # 再現性のためのシード
n_samples = 1000

pixel = np.random.randint(0, 36, n_samples)
itype = np.random.randint(0, 6, n_samples)
time = np.cumsum(np.random.random(n_samples))
energy = np.random.randint(0, 10001, n_samples)

np.isinを使ったフィルタリング

次に、np.isinを使ってデータをフィルタリングします。今回は、pixel[3, 10, 15]のいずれかであり、かつitype[1, 3, 4]のいずれかであるデータを抽出します。

# フィルタリング条件
selected_pixels = [3, 10, 15]
selected_itype = [1, 3, 4]

# np.isin関数を使ってフィルタリング
filtered_indices = np.where(np.isin(pixel, selected_pixels) & np.isin(itype, selected_itype))

filtered_pixel = pixel[filtered_indices]
filtered_itype = itype[filtered_indices]
filtered_time = time[filtered_indices]
filtered_energy = energy[filtered_indices]

ここで、np.isin関数はpixelおよびitypeの値が指定したリストに含まれているかをチェックし、その結果に基づいてフィルタリングを行います。

invert=Trueを使った逆論理のフィルタリング

逆に、pixel[3, 10, 15]のいずれでもなく、かつitype[1, 3, 4]のいずれでもないデータを抽出するには、invert=Trueオプションを使用します。

# np.isin関数を使って逆論理でフィルタリング
filtered_indices_inverted = np.where(np.isin(pixel, selected_pixels, invert=True) & np.isin(itype, selected_itype, invert=True))

filtered_pixel_inverted = pixel[filtered_indices_inverted]
filtered_itype_inverted = itype[filtered_indices_inverted]
filtered_time_inverted = time[filtered_indices_inverted]
filtered_energy_inverted = energy[filtered_indices_inverted]

データの可視化

フィルタリング前後のデータを可視化するために、matplotlibを使います。itypeは0から5の整数なので、離散カラーマップを使用して色分けを行います。

import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

# 離散カラーマップの作成
cmap = mcolors.ListedColormap(['red', 'green', 'blue', 'orange', 'purple', 'brown'])
bounds = np.arange(7) - 0.5
norm = mcolors.BoundaryNorm(bounds, cmap.N)

# 可視化
plt.figure(figsize=(14, 10))

# フィルタリング前のデータ
plt.subplot(2, 2, 1)
sc = plt.scatter(pixel, energy, c=itype, cmap=cmap, norm=norm, alpha=0.6)
plt.colorbar(sc, ticks=np.arange(6), label='itype')
plt.xlabel('Pixel')
plt.ylabel('Energy')
plt.title('Pixel vs. Energy (Before Filtering)')

plt.subplot(2, 2, 2)
sc = plt.scatter(time, energy, c=itype, cmap=cmap, norm=norm, alpha=0.6)
plt.colorbar(sc, ticks=np.arange(6), label='itype')
plt.xlabel('Time')
plt.ylabel('Energy')
plt.title('Time vs. Energy (Before Filtering)')

# フィルタリング後のデータ
plt.subplot(2, 2, 3)
sc = plt.scatter(filtered_pixel, filtered_energy, c=filtered_itype, cmap=cmap, norm=norm, alpha=0.6)
plt.colorbar(sc, ticks=np.arange(6), label='itype')
plt.xlabel('Pixel')
plt.ylabel('Energy')
plt.title('Pixel vs. Energy (After Filtering)')

plt.subplot(2, 2, 4)
sc = plt.scatter(filtered_time, filtered_energy, c=filtered_itype, cmap=cmap, norm=norm, alpha=0.6)
plt.colorbar(sc, ticks=np.arange(6), label='itype')
plt.xlabel('Time')
plt.ylabel('Energy')
plt.title('Time vs. Energy (After Filtering)')

plt.tight_layout()
plt.show()

スクリーンショット 2024-07-25 2.23.37.png

まとめ

np.isinを使うことで、特定の条件に基づいたデータのフィルタリングが簡単に行えます。invert=Trueオプションを使用することで、逆論理を適用して指定した値に含まれない要素をフィルタリングすることもできます。また、フィルタリング前後のデータを可視化することで、その効果を視覚的に確認することができます。この記事が、np.isinの使い方の理解に役立てば幸いです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1