numpyのuniqueの使い方を解説

Python

numpyのunique関数は、配列から重複を除いた一意の値を取得する関数です。本記事では、基本的な使い方から詳細なパラメータ設定まで、実際のコード例とともに解説します。

基本的な使い方

numpy.unique関数は、配列内の重複する要素を除去し、ソートされた一意の値を返す関数です。データ分析において重複データの除去や、配列内にどのような値が含まれているかを確認する際に使用されます。

最もシンプルな使い方は、配列を渡すだけで一意の値を取得する方法です。

重複する要素を含む配列からnp.unique()を使って一意の値を取得する例です。

import numpy as np

# 基本的な使用例
arr = np.array([1, 2, 2, 3, 3, 3, 4])
unique_values = np.unique(arr)
print(unique_values)
# 出力: [1 2 3 4]

詳細な設定

インデックスを返す設定

return_indexパラメータをTrueに設定すると、元の配列で一意の値が最初に現れる位置のインデックスも取得できます。

return_indexパラメータを使って一意の値とそのインデックスを同時に取得する例です。

import numpy as np

arr = np.array([1, 2, 2, 3, 3, 3, 4])
unique_values, indices = np.unique(arr, return_index=True)
print(f"一意の値: {unique_values}")
print(f"インデックス: {indices}")
# 出力: 一意の値: [1 2 3 4]
# 出力: インデックス: [0 1 3 6]

逆インデックスを返す設定

return_inverseパラメータをTrueに設定すると、元の配列を再構築するためのインデックスを取得できます。

return_inverseパラメータを使って逆インデックスを取得し、元の配列を再構築する例です。

import numpy as np

arr = np.array([1, 2, 2, 3, 3, 3, 4])
unique_values, inverse_indices = np.unique(arr, return_inverse=True)
print(f"一意の値: {unique_values}")
print(f"逆インデックス: {inverse_indices}")
print(f"再構築: {unique_values[inverse_indices]}")
# 出力: 一意の値: [1 2 3 4]
# 出力: 逆インデックス: [0 1 1 2 2 2 3]
# 出力: 再構築: [1 2 2 3 3 3 4]

この例では、unique_valuesの長さは4、inverse_indicesの長さは7となっています。unique_values[inverse_indices]が動作する理由は、NumPyの配列インデックシングでは、インデックス配列の各要素が対象配列の有効な範囲内(0から3)であれば、配列の長さに関係なくアクセスできるためです。inverse_indicesの各値(0, 1, 1, 2, 2, 2, 3)は全てunique_valuesの有効なインデックスなので、正常に動作します。

なお、この機能はNumPy配列特有のもので、普通のPythonリストでは同じことはできません。Pythonリストは一度に一つのインデックスしか受け取れないため、list[[0, 1, 1, 2]]のような操作はエラーになります。同じ結果を得るには、リスト内包表記を使って[unique_list[i] for i in inverse_list]のように記述する必要があります。

出現回数を返す設定

return_countsパラメータをTrueに設定すると、各一意の値が元の配列に何回現れるかを取得できます。

return_countsパラメータを使って一意の値とその出現回数を同時に取得する例です。

import numpy as np

arr = np.array([1, 2, 2, 3, 3, 3, 4])
unique_values, counts = np.unique(arr, return_counts=True)
print(f"一意の値: {unique_values}")
print(f"出現回数: {counts}")
# 出力: 一意の値: [1 2 3 4]
# 出力: 出現回数: [1 2 3 1]

軸を指定した処理

axisパラメータを指定すると、多次元配列の特定の軸に沿って一意の値を取得できます。

axisパラメータを使って2次元配列から重複する行を除去し、一意の行のみを取得する例です。

import numpy as np

# 2次元配列での例
arr = np.array([[1, 2], [2, 3], [1, 2], [3, 4]])
unique_rows = np.unique(arr, axis=0)
print(f"一意の行:\n{unique_rows}")
# 出力: 一意の行:
# [[1 2]
#  [2 3]
#  [3 4]]

NaN値の処理設定

equal_nanパラメータ(デフォルト:True)は、NaN値の扱い方を制御します。Trueに設定すると、NaN値を同じ値として扱い、Falseの場合は各NaN値を異なる値として扱います。

equal_nanパラメータをTrue(デフォルト)に設定してNaN値を含む配列から一意の値を取得する例です。

import numpy as np

arr = np.array([1.0, 2.0, np.nan, 2.0, np.nan, 3.0])
unique_values = np.unique(arr, equal_nan=True)
print(f"一意の値: {unique_values}")
# 出力: 一意の値: [ 1.  2.  3. nan]

equal_nanパラメータをFalseに設定した場合の動作を確認する例です。

import numpy as np

arr = np.array([1.0, 2.0, np.nan, 2.0, np.nan, 3.0])
unique_values = np.unique(arr, equal_nan=False)
print(f"一意の値 (equal_nan=False): {unique_values}")
# 出力: 一意の値 (equal_nan=False): [ 1.  2.  3. nan nan]

まとめ

numpyのunique関数は、配列から重複を除いた一意の値を取得する便利な関数です。基本的な使い方に加えて、インデックス情報や出現回数、軸指定など、様々なオプションを活用することで、データ分析や前処理において柔軟な処理が可能になります。特に、データの重複除去や統計情報の取得において重要な役割を果たします。

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