PyTorch에서 인덱싱(Indexing)과 슬라이싱(Slicing)을 사용하면 텐서(Tensor)의 값에 자유롭게 접근할 수 있습니다. 인덱싱은 텐서 내 특정 위치의 단일 요소 값을 가져올 때 사용하고, 슬라이싱은 연속된 여러 요소의 값을 한 번에 가져올 때 사용합니다.
텐서의 값을 수정할 때는 대입 연산자(=)를 활용합니다. 인덱싱이나 슬라이싱으로 접근한 위치에 새로운 값을 대입하면 해당 부분이 새로운 값으로 변경됩니다.
처리 순서
필요한 라이브러리를 임포트합니다. 이 예제에서는 torch 라이브러리가 필요합니다.
PyTorch 텐서를 정의합니다.
인덱싱을 사용해 특정 인덱스의 단일 요소 값에 접근하거나, 슬라이싱을 사용해 연속된 여러 요소의 값에 접근합니다.
대입 연산자를 사용해 접근한 값을 새로운 값으로 수정합니다.
마지막으로 텐서를 출력하여 새로운 값으로 제대로 변경되었는지 확인합니다.
예제 1: 인덱싱으로 값 접근 및 수정하기
# PyTorch에서 텐서의 값에 접근하고 수정하는 파이썬 프로그램
# 라이브러리 임포트
import torch
# PyTorch 텐서 정의
a = torch.Tensor([[3, 5],[1, 2],[5, 7]])
print("a:\n",a)
# 인덱싱으로 [1,0] 위치(2행 1열)의 값에 접근
b = a[1,0]
print("a[1,0]:\n", b)
# 다른 인덱싱 방법으로 값에 접근
c = a[1][0]
print("a[1][0]:\n",c)
# 값 1을 새로운 값 9로 수정
# 대입 연산자를 사용해 새로운 값으로 변경
a[1,0] = 9
print("a[1,0] 위치의 값을 수정한 후의 텐서 'a':")
print("a:\n",a)출력 결과
a:
tensor([[3., 5.],
[1., 2.],
[5., 7.]])
a[1,0]:
tensor(1.)
a[1][0]:
tensor(1.)
a[1,0] 위치의 값을 수정한 후의 텐서 'a':
a:
tensor([[3., 5.],
[9., 2.],
[5., 7.]])위 예제에서 볼 수 있듯이 a[1,0]과 a[1][0] 두 가지 방식 모두 동일하게 2행 1열의 값인 tensor(1.)을 반환합니다. 그리고 a[1,0] = 9로 대입한 후에는 해당 위치의 값이 9.로 변경된 것을 확인할 수 있습니다.
예제 2: 슬라이싱으로 값 접근 및 수정하기
# PyTorch에서 텐서의 값에 접근하고 수정하는 파이썬 프로그램
# 필요한 라이브러리 임포트
import torch
# PyTorch 텐서 정의
a = torch.Tensor([[3, 5],[1, 2],[5, 7]])
print("a:\n", a)
# 슬라이싱으로 2번째 행의 모든 값에 접근
b = a[1]
print("a[1]:\n", a[1])
# 1번째와 2번째 행의 모든 값에 접근
b = a[0:2]
print("a[0:2]:\n" , a[0:2])
# 2번째 열의 모든 값에 접근
c = a[:,1]
print("a[:,1]:\n", a[:,1])
# 첫 두 행 중 2번째 열의 값에 접근
print("a[0:2, 1]:\n", a[0:2, 1])
# 대입 연산자를 사용해 새로운 값으로 수정
# 2번째 행의 값 수정
a[1] = torch.Tensor([9, 9])
print("a[1] 수정 후:\n", a)
# 첫 두 행 중 2번째 열의 값 수정
a[0:2, 1] = torch.Tensor([4, 4])
print("a[0:2, 1] 수정 후:\n", a)출력 결과
a:
tensor([[3., 5.],
[1., 2.],
[5., 7.]])
a[1]:
tensor([1., 2.])
a[0:2]:
tensor([[3., 5.],
[1., 2.]])
a[:,1]:
tensor([5., 2., 7.])
a[0:2, 1]:
tensor([5., 2.])
a[1] 수정 후:
tensor([[3., 5.],
[9., 9.],
[5., 7.]])
a[0:2, 1] 수정 후:
tensor([[3., 4.],
[9., 4.],
[5., 7.]])핵심 정리
슬라이싱 문법을 간단히 정리하면 다음과 같습니다.
a[1]: 특정 행 전체를 선택합니다.a[0:2]: 범위 지정을 통해 여러 행을 선택합니다. 끝 인덱스는 포함되지 않습니다.a[:,1]: 콜론(:)을 사용해 모든 행 중 특정 열만 선택합니다.a[0:2, 1]: 행과 열을 동시에 지정하여 원하는 영역만 선택합니다.
이렇게 인덱싱과 슬라이싱으로 접근한 영역에 대입 연산자를 적용하면, 텐서의 일부 또는 전체 값을 손쉽게 수정할 수 있습니다. PyTorch 텐서는 NumPy 배열과 유사한 슬라이싱 문법을 지원하므로, NumPy에 익숙하다면 더욱 쉽게 활용할 수 있습니다.