기본 인덱싱
인덱싱이란?
섹션 제목: “인덱싱이란?”인덱싱(indexing) 은 텐서의 특정 위치에 있는 원소나 부분 텐서를 선택하는 연산입니다. PyTorch는 NumPy와 거의 동일한 인덱싱 문법을 지원하므로, NumPy에 익숙하다면 바로 활용할 수 있습니다.
1D 텐서 인덱싱
섹션 제목: “1D 텐서 인덱싱”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 -12D 텐서 인덱싱
섹션 제목: “2D 텐서 인덱싱”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])NumPy 스타일 인덱싱과의 비교
섹션 제목: “NumPy 스타일 인덱싱과의 비교”| 기능 | NumPy | PyTorch | 결과 |
|---|---|---|---|
| 단일 원소 | a[0] | t[0] | 동일 |
| 다차원 원소 | a[1, 2] | t[1, 2] | 동일 |
| 음수 인덱스 | a[-1] | t[-1] | 동일 |
| 행 선택 | a[0, :] | t[0] | 동일 |
| 반환 타입 | np.ndarray | torch.Tensor | 다름 |
| 스칼라 변환 | .item() | .item() | 동일 |
import torchimport 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)