Python/Numpy

[Numpy] np.unique 사용법 정리 : 고유한 값들만 모아서 반환

jimmy_AI 2022. 3. 24. 21:26
반응형

파이썬 넘파이 unique 함수 예제

이번 글에서는 파이썬의 넘파이 라이브러리 내에서 배열 내의 distinct 원소들만을

모은 결과를 반환해주는 np.unique 함수의 사용법에 대해서 살펴보겠습니다.

 

참고로, 이 글은 numpy의 unique 함수 설명 공식 document 내용을 기반으로 작성되었습니다.

 

 

np.unique 기본 사용 방법

unique 내에 배열(리스트, numpy array 등) 자료만 input으로 넣어주면 사용이 완료됩니다.

고유한 원소들을 모은 뒤, 1차원 shape으로 변환하고 정렬을 진행한 결과를 반환합니다.

 

문자열이 포함된 경우, 전부 문자열로 변환된 결과가 나타나게 되며

이 때, 정수형 3과 문자열 '3'은 같은 값으로 취급됩니다.

import numpy as np

np.unique([1, 2, 2, 2, 3, 3, 4]) # array([1, 2, 3, 4])

np.unique([[1, 3, 5],
           [2, 2, 3]]) # array([1, 2, 3, 5])

np.unique(['a', 'b', 3, 5, 'a', '3']) # array(['3', '5', 'a', 'b'], dtype='<U21')

 

 

np.unique axis 설정 방법

때에 따라서, 값 1개 단위가 아니라 특정 axis를 기준으로 잡은 블록을 단위

고유한 배열들의 집합을 구할 수도 있습니다.

 

이해를 돕기 위하여

아래의 2차원 배열에서 axis를 0과 1로 설정하여 unique를 적용한 예시를 살펴보겠습니다.

a = np.array([[1, 0, 0],
              [1, 0, 0],
              [2, 3, 3]])

np.unique(a, axis = 0)
'''array([[1, 0, 0],
       [2, 3, 3]])'''

np.unique(a, axis = 1)
'''array([[0, 1],
       [0, 1],
       [3, 2]])'''
반응형

axis = 0인 경우, 1 0 02 3 3의 두 가지 형태의 블록이 고유한 블록입니다.

정렬 순서 상 1 0 0 이 2 3 3 보다 첫 값이 작아 먼저 등장하므로, 위와 같은 결과를 나타냅니다.

 

반면, axis = 1인 경우, 1 1 20 0 3의 두 형태의 블록이 고유한 블록으로 등장합니다.

0 0 3이 1 1 2보다 첫 값이 더 작으므로, 0 0 3이 가장 첫 열에 등장한 결과가 반환됩니다.

 

 

np.unique index, inverse, counts 정보 추가 반환 방법

numpy의 unique 함수에서는 각 고유 원소가 처음 등장한 위치인 index 정보와

각 값이 몇 번째 고유 원소에 매칭되는지에 대한 inverse 정보,

그리고 각 고유 원소가 등장한 총 횟수를 나타내는 counts 정보를 추가로 받을 수 있습니다.

 

각각 return_index, return_inverse, return_counts 인자를 True로 설정하면

튜플 형태로 unique 결과와 함께 위 정보들을 추가로 받는 것이 가능합니다.

# 3, 4, 5, 8이 각각 처음으로 등장한 인덱스 번호
np.unique([3, 5, 8, 8, 5, 5, 4], return_index = True)
# (array([3, 4, 5, 8]), array([0, 6, 1, 2]))

# 3, 4, 5, 8을 0, 1, 2, 3으로 취급했을 때, 원래 값들에 매칭되는 번호
np.unique([3, 5, 8, 8, 5, 5, 4], return_inverse = True)
# (array([3, 4, 5, 8]), array([0, 2, 3, 3, 2, 2, 1]))

# 3, 4, 5, 8이 각각 등장하는 횟수
np.unique([3, 5, 8, 8, 5, 5, 4], return_counts = True)
# (array([3, 4, 5, 8]), array([1, 1, 3, 2]))