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|抽出・条件の関連記事

条件指定やスライスで、配列から必要な要素を取り出す操作の記事です。

NumPy全体の使い方は「NumPyの使い方」、「NumPy関数一覧」でまとめています。