np.uniqueとは?NumPy配列の重複を削除してユニークな値を取得する方法

PythonのNumPyには、配列の中から重複を取り除き、異なる値だけを取得するnp.unique()という関数があります。
たとえば、次のような配列があるとします。
import numpy as np
a = np.array([1, 2, 2, 3, 3, 3, 4])
print(np.unique(a))
実行すると、次のようになります。
[1 2 3 4]
このように、np.unique()を使うと配列の重複した値を取り除いて、ユニークな値だけを取得できます。
NumPyの公式ドキュメントでも、np.unique()は配列からユニークな要素を取得する関数として説明されています。デフォルトでは取得した値はソートされます。
np.uniqueの基本的な使い方
np.unique()の基本構文は次のとおりです。
np.unique(配列)
実際に使ってみましょう。
import numpy as np
numbers = np.array([10, 20, 20, 30, 30, 30])
result = np.unique(numbers)
print(result)
実行結果:
[10 20 30]
20や30のように複数回登場する値があっても、結果には1回だけ表示されます。
np.uniqueで重複を削除する
np.unique()は、NumPy配列の重複データを削除したいときによく利用されます。
import numpy as np
data = np.array([1, 1, 2, 2, 2, 3, 4, 4])
unique_data = np.unique(data)
print(unique_data)
結果:
[1 2 3 4]
「同じ値が何個あるか」ではなく、「どのような値が存在するか」を確認したい場合に便利です。
np.uniqueは結果がソートされる
np.unique()は、基本的にユニークな値をソートして返します。
import numpy as np
data = np.array([30, 10, 20, 10, 30])
print(np.unique(data))
結果:
[10 20 30]
元の配列は[30, 10, 20, 10, 30]ですが、結果は小さい順に並んでいます。
そのため、「重複を削除するだけで、元の登場順をそのまま維持したい」という場合には注意が必要です。
np.uniqueで出現回数を取得する
return_counts=Trueを指定すると、それぞれの値が何回登場したのかを取得できます。
import numpy as np
data = np.array([1, 2, 2, 3, 3, 3])
values, counts = np.unique(data, return_counts=True)
print(values)
print(counts)
結果:
[1 2 3]
[1 2 3]
これは次のような意味です。
| 値 | 出現回数 |
|---|---|
| 1 | 1回 |
| 2 | 2回 |
| 3 | 3回 |
公式ドキュメントでも、return_counts=Trueを指定することで各ユニーク値の出現回数を取得できるとされています。
np.uniqueのreturn_indexとは
return_index=Trueを指定すると、ユニークな値が元の配列で最初に登場した位置を取得できます。
import numpy as np
data = np.array(["A", "B", "B", "C", "A"])
values, indexes = np.unique(data, return_index=True)
print(values)
print(indexes)
結果:
['A' 'B' 'C']
[0 1 3]
たとえば「A」は元の配列の0番目、「B」は1番目、「C」は3番目に最初に登場しています。
このように、return_index=Trueを使うとユニークな値だけでなく、その値が最初に登場したインデックスも取得できます。
np.uniqueのreturn_inverseとは
return_inverse=Trueを指定すると、元の配列をユニークな値から再構築するためのインデックスを取得できます。
import numpy as np
data = np.array([10, 20, 10, 30, 20])
values, inverse = np.unique(data, return_inverse=True)
print(values)
print(inverse)
結果は次のようになります。
[10 20 30]
[0 1 0 2 1]
このインデックスを使って、元の配列を再構築できます。
print(values[inverse])
結果:
[10 20 10 30 20]
return_inverseは、ユニークな値と、それらを参照するインデックスの関係を利用したい場合に便利です。
return_countsとreturn_indexを同時に使う
複数のオプションを同時に指定することもできます。
import numpy as np
data = np.array([10, 20, 20, 30, 10])
values, indexes, counts = np.unique(
data,
return_index=True,
return_counts=True
)
print(values)
print(indexes)
print(counts)
結果:
[10 20 30]
[0 1 3]
[2 2 1]
この場合、ユニークな値、最初に登場した位置、出現回数をそれぞれ取得できます。
2次元配列でnp.uniqueを使う
np.unique()は2次元配列にも使用できます。
import numpy as np
data = np.array([
[1, 2],
[1, 2],
[3, 4]
])
print(np.unique(data))
結果:
[1 2 3 4]
axisを指定しない場合、配列全体を対象として処理します。公式ドキュメントでは、axis=Noneの場合、入力配列は1次元に展開されて処理されると説明されています。
np.uniqueで重複した行を削除する
2次元配列で「重複した行」を削除したい場合は、axis=0を指定します。
import numpy as np
data = np.array([
[1, 2],
[1, 2],
[3, 4]
])
result = np.unique(data, axis=0)
print(result)
結果:
[[1 2]
[3 4]]
同じ[1, 2]という行が2回ありますが、axis=0によって重複した行が1つにまとめられています。
np.uniqueで列の重複を削除する
axis=1を指定すると、列方向を対象に処理できます。
import numpy as np
data = np.array([
[1, 1, 2],
[3, 3, 4]
])
result = np.unique(data, axis=1)
print(result)
列単位で同じデータが存在する場合に、重複した列を取り除くことができます。
np.uniqueの主な引数
np.unique()では、次のような引数を利用できます。
| 引数 | 意味 |
|---|---|
ar |
対象となる配列 |
return_index |
最初に登場したインデックスを返す |
return_inverse |
元の配列を再構築するためのインデックスを返す |
return_counts |
各値の出現回数を返す |
axis |
重複を削除する方向を指定する |
equal_nan |
NaNを同一の値として扱うか指定する |
sorted |
結果をソートするか指定する |
現在のNumPyでは、equal_nanは1.24以降、sortedは2.3以降で追加された引数です。
np.uniqueとPythonのsetの違い
Pythonには重複を削除するためのsetもあります。
numbers = [1, 2, 2, 3, 3]
print(set(numbers))
NumPy配列を扱っているのであれば、np.unique()を利用する方法が分かりやすいでしょう。
特に、出現回数や元のインデックス、2次元配列の行・列なども扱いたい場合は、np.unique()が便利です。
np.uniqueとpandasのuniqueの違い
pandasにも重複を取り除くための機能があります。
import pandas as pd
data = pd.Series([1, 2, 2, 3])
print(data.unique())
一方、NumPy配列を中心に処理している場合は、np.unique()が使いやすいでしょう。
NumPyは数値計算や配列処理、pandasは表形式のデータ処理というように、用途に応じて使い分けることが大切です。
np.uniqueを使うときの注意点
元の順番が変わる
np.unique()はデフォルトでは結果をソートします。
import numpy as np
data = np.array([30, 10, 20, 30])
print(np.unique(data))
結果:
[10 20 30]
そのため、単純に「重複を削除して元の順番を維持したい」という用途では注意が必要です。
2次元配列ではaxisを意識する
2次元配列に対してnp.unique()を使う場合、axisを指定しなければ配列全体が対象になります。
np.unique(data)
行単位で重複を削除したい場合は、次のようにします。
np.unique(data, axis=0)
np.uniqueのまとめ
np.unique()は、NumPy配列から重複を取り除いて、ユニークな値を取得するための関数です。
- 重複した値を削除できる
- デフォルトでは結果がソートされる
return_counts=Trueで出現回数を取得できるreturn_index=Trueで最初に登場した位置を取得できるreturn_inverse=Trueで元の配列を再構築できるaxis=0で重複した行を削除できるaxis=1で重複した列を削除できる
特に、NumPyでデータ分析を行う場合、「重複するデータを取り除く」「値ごとの件数を調べる」といった処理でnp.unique()は役立ちます。
まずは次のコードを実際に実行して、動作を確認してみましょう。
import numpy as np
data = np.array([1, 2, 2, 3, 3, 3, 4])
values, counts = np.unique(data, return_counts=True)
print(values)
print(counts)
NumPyを学習する場合は、関数を暗記するだけでなく、実際に配列を作ってコードを実行し、結果がどう変化するのかを確認することが重要です。
NumPy|抽出・条件の関連記事
条件指定やスライスで、配列から必要な要素を取り出す操作の記事です。


