파이토치에서 텐서의 고유한 요소 개수 계산하기
torch.unique() 사용:
import torch
# 텐서 생성
tensor = torch.tensor([1, 2, 3, 1, 2, 4, 5, 1])
# 고유한 요소 추출 및 개수 계산
unique_elements, counts = torch.unique(tensor, return_counts=True)
num_unique_elements = len(unique_elements)
print(f"고유한 요소 개수: {num_unique_elements}")
print(f"고유한 요소: {unique_elements}")
print(f"각 요소의 개수: {counts}")
collections.Counter() 사용:
from collections import Counter
# 텐서를 리스트로 변환
tensor_list = tensor.tolist()
# Counter 객체 생성
counter = Counter(tensor_list)
# 고유한 요소 개수 계산
num_unique_elements = len(counter)
print(f"고유한 요소 개수: {num_unique_elements}")
print(f"고유한 요소: {counter.keys()}")
print(f"각 요소의 개수: {counter.values()}")
import numpy as np
# 텐서를 NumPy 배열로 변환
tensor_array = tensor.numpy()
# 고유한 요소 추출 및 개수 계산
unique_elements, counts = np.unique(tensor_array, return_counts=True)
num_unique_elements = len(unique_elements)
print(f"고유한 요소 개수: {num_unique_elements}")
print(f"고유한 요소: {unique_elements}")
print(f"각 요소의 개수: {counts}")
방법 선택
각 방법마다 장단점이 있습니다.
torch.unique()
는 파이토치 텐서에 가장 적합하지만, 텐서가 CPU에 있는 경우만 작동합니다.collections.Counter()
는 텐서뿐만 아니라 다른 자료형에도 사용할 수 있지만,torch.unique()
보다 느릴 수 있습니다.numpy.unique()
는 NumPy 배열에 가장 적합하지만, 파이토치 텐서를 NumPy 배열로 변환해야 하는 추가 작업이 필요합니다.
따라서 사용 목적과 상황에 따라 적절한 방법을 선택해야 합니다.
참고:
torch.unique()
는 정렬된 텐서에서만 작동합니다. 텐서가 정렬되지 않은 경우tensor.sort()
를 사용하여 먼저 정렬해야 합니다.collections.Counter()
는 순서를 보존하지 않습니다. 즉, 딕셔너리 형태로 결과를 반환하며, 키 순서는 임의적입니다.numpy.unique()
는return_counts
매개변수를 사용하여 각 요소의 개수를 함께 계산할 수 있습니다.
예제 코드
import torch
# 텐서 생성
tensor = torch.tensor([1, 2, 3, 1, 2, 4, 5, 1])
# 방법 1: `torch.unique()` 사용
unique_elements, counts = torch.unique(tensor, return_counts=True)
num_unique_elements = len(unique_elements)
print(f"방법 1: `torch.unique()`")
print(f"고유한 요소 개수: {num_unique_elements}")
print(f"고유한 요소: {unique_elements}")
print(f"각 요소의 개수: {counts}")
# 방법 2: `collections.Counter()` 사용
from collections import Counter
tensor_list = tensor.tolist()
counter = Counter(tensor_list)
num_unique_elements = len(counter)
print(f"\n방법 2: `collections.Counter()`")
print(f"고유한 요소 개수: {num_unique_elements}")
print(f"고유한 요소: {counter.keys()}")
print(f"각 요소의 개수: {counter.values()}")
# 방법 3: `numpy.unique()` 사용
import numpy as np
tensor_array = tensor.numpy()
unique_elements, counts = np.unique(tensor_array, return_counts=True)
num_unique_elements = len(unique_elements)
print(f"\n방법 3: `numpy.unique()`")
print(f"고유한 요소 개수: {num_unique_elements}")
print(f"고유한 요소: {unique_elements}")
print(f"각 요소의 개수: {counts}")
이 코드를 실행하면 다음과 같은 결과가 출력됩니다.
방법 1: `torch.unique()`
고유한 요소 개수: 4
고유한 요소: tensor([1, 2, 3, 4])
각 요소의 개수: tensor([3, 2, 1, 1])
방법 2: `collections.Counter()`
고유한 요소 개수: 4
고유한 요소: dict_keys([1, 2, 3, 4])
각 요소의 개수: dict_values([3, 2, 1, 1])
방법 3: `numpy.unique()`
고유한 요소 개수: 4
고유한 요소: [1 2 3 4]
각 요소의 개수: [3 2 1 1]
대체 방법
torch.unique(..., sorted=False) 사용:
torch.unique()
함수의 sorted
매개변수를 False
로 설정하면 텐서를 정렬하지 않고 고유한 요소를 추출합니다.
unique_elements = torch.unique(tensor, sorted=False)
num_unique_elements = len(unique_elements)
print(f"고유한 요소 개수: {num_unique_elements}")
print(f"고유한 요소: {unique_elements}")
torch.bincount() 사용:
torch.bincount()
함수는 텐서의 각 값이 나타나는 횟수를 계산합니다.
counts = torch.bincount(tensor)
num_unique_elements = torch.sum(counts > 0)
print(f"고유한 요소 개수: {num_unique_elements}")
print(f"각 요소의 개수: {counts}")
groupby 연산 사용:
itertools.groupby
함수를 사용하여 텐서의 요소를 그룹화하고 각 그룹의 크기를 계산할 수 있습니다.
from itertools import groupby
groups = groupby(tensor)
num_unique_elements = len(list(groups))
print(f"고유한 요소 개수: {num_unique_elements}")
Pandas DataFrame 사용:
만약 텐서가 Pandas DataFrame 형태라면 DataFrame.unique()
메서드를 사용하여 고유한 요소 개수를 계산할 수 있습니다.
import pandas as pd
df = pd.DataFrame(tensor)
num_unique_elements = df.unique().shape[0]
print(f"고유한 요소 개수: {num_unique_elements}")
각 방법마다 장단점이 있으며, 상황에 따라 적절한 방법을 선택해야 합니다.
torch.unique(..., sorted=False)
는 텐서를 정렬하지 않아 속도가 빠르지만, 결과가 정렬되지 않습니다.torch.bincount()
는 텐서의 크기가 작을 때 효율적입니다.groupby
연산은 텐서의 크기가 클 때 효율적입니다.Pandas DataFrame.unique()
는 Pandas DataFrame을 사용하는 경우 편리합니다.
pytorch