Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

PyTorch 텐서의 값에 접근하고 수정하는 방법 총정리

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에 익숙하다면 더욱 쉽게 활용할 수 있습니다.