NumPyで重複データを徹底攻略!ユニークな値・個数・位置を完全取得
データ分析や機械学習の現場では、データセットの中から重複しないユニークな値を見つけ出したり、それぞれの値がいくつ存在するかを数えたり、あるいはその値がどこにあるかを特定したりする作業が頻繁に発生します。NumPyは、このような重複データ(デュプリケート)の処理を効率的に行うための強力な関数を提供しています。この記事では、NumPy配列(ndarray)からユニークな要素の値、その個数、そして元の配列における位置を取得する方法について、具体的なサンプルコードを交えながら詳しく解説します。
NumPyにおけるユニークな要素の概念
NumPy配列における「ユニークな要素」とは、配列内に複数回出現する値があったとしても、その値を一度だけカウントしたものです。例えば、[1, 2, 2, 3, 1]という配列のユニークな要素は[1, 2, 3]となります。
1. ユニークな要素の値を取得:np.unique()
np.unique()は、配列内の重複しないユニークな値を抽出するための最も基本的な関数です。
書式
numpy.unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None)
ar: ユニークな要素を抽出したい入力配列。return_index(オプション):Trueにすると、ユニークな値が元の配列のどこで最初に出現したかのインデックスも返します。return_inverse(オプション):Trueにすると、元の配列の各要素が、ユニークな値の配列のどのインデックスに対応するかを返します。return_counts(オプション):Trueにすると、各ユニークな値が元の配列に何回出現したかのカウントも返します。axis(オプション): 多次元配列の場合、どの軸に沿ってユニークな行/列を検出するかを指定します。
サンプルコード
import numpy as np
arr = np.array([1, 5, 2, 5, 3, 1, 4, 2])
print("元の配列:", arr)
# ユニークな値のみを取得
unique_values = np.unique(arr)
print("ユニークな値:", unique_values)
出力例
元の配列: [1 5 2 5 3 1 4 2]
ユニークな値: [1 2 3 4 5]
2. ユニークな要素の出現個数を取得:np.unique(return_counts=True)
各ユニークな値が元の配列内で何回出現するかを知りたい場合は、np.unique()のreturn_counts=Trueオプションを使用します。
サンプルコード
import numpy as np
arr = np.array([1, 5, 2, 5, 3, 1, 4, 2])
# ユニークな値とそれぞれの出現回数を取得
unique_values, counts = np.unique(arr, return_counts=True)
print("ユニークな値:", unique_values)
print("出現回数:", counts)
# 例: 1は2回、2は2回、3は1回、4は1回、5は2回出現
出力例
ユニークな値: [1 2 3 4 5]
出現回数: [2 2 1 1 2]
3. ユニークな要素の「最初の」位置(インデックス)を取得:np.unique(return_index=True)
各ユニークな値が、元の配列で最初に出現した位置(インデックス)を知りたい場合は、np.unique()のreturn_index=Trueオプションを使用します。
サンプルコード
import numpy as np
arr = np.array([1, 5, 2, 5, 3, 1, 4, 2])
# インデックス: 0 1 2 3 4 5 6 7
# ユニークな値と、それらが最初に出現したインデックスを取得
unique_values, first_indices = np.unique(arr, return_index=True)
print("ユニークな値:", unique_values)
print("最初の出現インデックス:", first_indices)
# 例えば、値3 (ユニーク値の配列でインデックス2) は元の配列のインデックス4で最初に出現
# arr[first_indices[2]] -> arr[4] -> 3
出力例
ユニークな値: [1 2 3 4 5]
最初の出現インデックス: [0 2 4 6 1]
4. 多次元配列(行や列)のユニークな要素を取得
np.unique()は、多次元配列に対しても適用できます。axis引数を使用すると、特定の軸に沿ってユニークな行や列を抽出できます。
サンプルコード
import numpy as np
arr_2d = np.array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3],
[7, 8, 9]])
print("元の2D配列:\n", arr_2d)
# 重複する行を除外してユニークな行を取得
# axis=0 を指定すると、行ごとに比較される
unique_rows = np.unique(arr_2d, axis=0)
print("\nユニークな行:\n", unique_rows)
# ユニークな行とそれぞれの出現回数を取得
unique_rows_with_counts, counts_rows = np.unique(arr_2d, axis=0, return_counts=True)
print("\nユニークな行と出現回数:\n", unique_rows_with_counts)
print("行の出現回数:", counts_rows)
出力例
元の2D配列:
[[1 2 3]
[4 5 6]
[1 2 3]
[7 8 9]]
ユニークな行:
[[1 2 3]
[4 5 6]
[7 8 9]]
ユニークな行と出現回数:
[[1 2 3]
[4 5 6]
[7 8 9]]
行の出現回数: [2 1 1]
まとめ
NumPyのnp.unique()関数は、配列内の重複データを処理するための非常に強力で柔軟なツールです。
np.unique(arr): 配列内の重複しないユニークな値を抽出します。np.unique(arr, return_counts=True): ユニークな値だけでなく、それぞれの出現回数も同時に取得できます。np.unique(arr, return_index=True): 各ユニークな値が元の配列で**最初に出現した位置(インデックス)**を取得できます。np.unique(arr, axis=...): 多次元配列の場合、特定の軸に沿ってユニークな行や列を識別・抽出できます。
これらの機能は、データの前処理、カテゴリカルデータの分析、欠陥検出、または単純な頻度分析など、多岐にわたるデータサイエンスのタスクで不可欠です。np.unique()を使いこなすことで、データ探索とクリーニングの効率を大幅に向上させることができるでしょう。ぜひ、あなたのNumPyワークフローに取り入れてみてください!📊
