콘텐츠로 이동

기본 인덱싱

인덱싱(indexing) 은 텐서의 특정 위치에 있는 원소나 부분 텐서를 선택하는 연산입니다. PyTorch는 NumPy와 거의 동일한 인덱싱 문법을 지원하므로, NumPy에 익숙하다면 바로 활용할 수 있습니다.

import torch
v = torch.tensor([10, 20, 30, 40, 50])
# 양수 인덱싱 (0부터 시작)
print(v[0]) # tensor(10)
print(v[2]) # tensor(30)
print(v[4]) # tensor(50)
# 인덱스 범위 초과 시 오류
# v[5] # IndexError: index 5 is out of bounds for dimension 0 with size 5

결과는 스칼라 텐서입니다. 파이썬 정수로 변환하려면 .item() 을 사용합니다.

val = v[2]
print(type(val)) # <class 'torch.Tensor'>
print(val.item()) # 30 (파이썬 int)

음수 인덱스는 끝에서부터 셉니다. -1 이 마지막 원소입니다.

import torch
v = torch.tensor([10, 20, 30, 40, 50])
print(v[-1]) # tensor(50) ← 마지막
print(v[-2]) # tensor(40) ← 끝에서 두 번째
print(v[-5]) # tensor(10) ← 첫 번째 (v[0]과 동일)
인덱스: 0 1 2 3 4
[10, 20, 30, 40, 50]
음수: -5 -4 -3 -2 -1

2D 텐서에서 tensor[row, col] 형식으로 특정 원소에 접근합니다. 아래 시각화에서 하이라이트된 원소가 각 인덱싱 결과입니다.

m[1, 2] = 6
1
2
3
4
5
6
7
8
9
m[0] = 첫 번째 행
1
2
3
4
5
6
7
8
9
m[:, 1] = 두 번째 열
1
2
3
4
5
6
7
8
9
import torch
m = torch.tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 특정 원소 접근
print(m[0, 0]) # tensor(1) ← 0행 0열
print(m[1, 2]) # tensor(6) ← 1행 2열
print(m[2, 1]) # tensor(8) ← 2행 1열
print(m[-1, -1]) # tensor(9) ← 마지막 행, 마지막 열
# 행 전체 선택 (1D 텐서 반환)
print(m[0]) # tensor([1, 2, 3])
print(m[1]) # tensor([4, 5, 6])
print(m[-1]) # tensor([7, 8, 9])

3D 이상의 텐서에서도 동일한 패턴이 적용됩니다.

import torch
# shape: (배치=2, 채널=3, 높이=4, 너비=4)
t = torch.randn(2, 3, 4, 4)
# 첫 번째 배치, 두 번째 채널, 3행, 2열의 픽셀값
pixel = t[0, 1, 2, 1]
print(pixel.shape) # torch.Size([]) ← 스칼라
# 첫 번째 배치의 모든 채널
batch0 = t[0]
print(batch0.shape) # torch.Size([3, 4, 4])
# 첫 번째 배치, 두 번째 채널 전체
channel = t[0, 1]
print(channel.shape) # torch.Size([4, 4])

정수 인덱싱은 해당 차원을 제거 합니다.

import torch
t = torch.randn(4, 3, 2)
print(t.shape) # torch.Size([4, 3, 2])
print(t[0].shape) # torch.Size([3, 2]) ← dim 0 제거
print(t[0, 1].shape) # torch.Size([2]) ← dim 0, 1 제거
print(t[0, 1, 0].shape) # torch.Size([]) ← 스칼라

차원을 유지하고 싶다면 슬라이싱(0:1) 또는 unsqueeze() 를 사용합니다.

import torch
t = torch.randn(4, 3, 2)
# 차원 유지: 슬라이싱 사용
print(t[0:1].shape) # torch.Size([1, 3, 2])
# 차원 유지: unsqueeze 사용
print(t[0].unsqueeze(0).shape) # torch.Size([1, 3, 2])
기능NumPyPyTorch결과
단일 원소a[0]t[0]동일
다차원 원소a[1, 2]t[1, 2]동일
음수 인덱스a[-1]t[-1]동일
행 선택a[0, :]t[0]동일
반환 타입np.ndarraytorch.Tensor다름
스칼라 변환.item().item()동일
import torch
import numpy as np
# NumPy와 PyTorch 인덱싱 비교
arr = np.array([[1, 2, 3], [4, 5, 6]])
ten = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(arr[1, 2]) # 6 (numpy.int64)
print(ten[1, 2]) # tensor(6)
print(ten[1, 2].item()) # 6 (python int)