PyTorch에서 두 텐서 사이의 요소별(element-wise) 나눗셈을 수행하려면 torch.div() 메서드를 사용하면 됩니다. 이 메서드는 첫 번째 입력 텐서의 각 요소를 두 번째 텐서의 대응하는 요소로 나눕니다. 텐서를 스칼라 값으로 나누는 것도 가능하고, 차원이 같은 텐서끼리는 물론 서로 다른 차원의 텐서끼리도 나눗셈할 수 있습니다. 이때 결과 텐서의 차원은 항상 더 높은 차원의 텐서를 따릅니다. 예를 들어 1D 텐서를 2D 텐서로 나누면 결과는 2D 텐서가 됩니다.
torch.div() 사용 단계
필요한 라이브러리를 임포트합니다. 아래의 모든 파이썬 예제에서는 torch 라이브러리가 필요하므로 미리 설치되어 있는지 확인하세요.
나눗셈에 사용할 두 개 이상의 PyTorch 텐서를 정의하고 출력합니다. 텐서를 스칼라로 나누려면 스칼라 값도 함께 정의합니다.
torch.div()를 사용해 텐서를 다른 텐서나 스칼라로 나누고, 그 결과를 새 변수에 할당합니다. 이 메서드는 원본 텐서를 수정하지 않고 새로운 텐서를 반환합니다.
최종 텐서를 출력합니다.
예제 1 – 텐서를 스칼라로 나누기
# 요소별 나눗셈을 수행하는 파이썬 프로그램
# 필요한 라이브러리 임포트
import torch
# 텐서 생성
t = torch.Tensor([2, 3, 5, 9])
print("원본 텐서 t:\n", t)
# 텐서를 스칼라 4로 나누기
v = torch.div(t, 4)
print("요소별 나눗셈 결과:\n", v)
# 아래 방식으로도 동일한 결과를 얻을 수 있습니다
t1 = torch.Tensor([4])
w = torch.div(t, t1)
print("요소별 나눗셈 결과:\n", w)
# 위 연산의 또 다른 구현 방법
t2 = torch.Tensor([4,4,4,4])
x = torch.div(t, t2)
print("요소별 나눗셈 결과:\n", x)
실행 결과
원본 텐서 t:
tensor([2., 3., 5., 9.])
요소별 나눗셈 결과:
tensor([0.5000, 0.7500, 1.2500, 2.2500])
요소별 나눗셈 결과:
tensor([0.5000, 0.7500, 1.2500, 2.2500])
요소별 나눗셈 결과:
tensor([0.5000, 0.7500, 1.2500, 2.2500])
세 가지 방식 모두 동일한 결과를 반환합니다. 스칼라로 나누든, 같은 값으로 채운 1D 텐서로 나누든, 크기가 같은 텐서로 요소별 나눗셈을 하든 결과는 같다는 점을 확인할 수 있습니다.
예제 2 – 2D 텐서를 1D 텐서로 나누기
다음 파이썬 프로그램은 2D 텐서를 1D 텐서로 나누는 방법을 보여줍니다.
# 필요한 라이브러리 임포트
import torch
# 2D 텐서 생성
T1 = torch.Tensor([[3,2],[7,5]])
# 1D 텐서 생성
T2 = torch.Tensor([10, 8])
print("T1:\n", T1)
print("T2:\n", T2)
# 2D 텐서를 1D 텐서로 나누기
v = torch.div(T1, T2)
print("요소별 나눗셈 결과:\n", v)
실행 결과
T1:
tensor([[3., 2.],
[7., 5.]])
T2:
tensor([10., 8.])
요소별 나눗셈 결과:
tensor([[0.3000, 0.2500],
[0.7000, 0.6250]])
1D 텐서 T2가 각 행에 브로드캐스팅(broadcasting)되어 열 방향으로 나눗셈이 수행된 것을 볼 수 있습니다.
예제 3 – 1D 텐서를 2D 텐서로 나누기
다음 파이썬 프로그램은 1D 텐서를 2D 텐서로 나누는 방법을 보여줍니다.
# 1D 텐서를 2D 텐서로 나누는 파이썬 프로그램
# 필요한 라이브러리 임포트
import torch
# 2D 텐서 생성
T1 = torch.Tensor([[8,7],[4,5]])
# 1D 텐서 생성
T2 = torch.Tensor([10, 5])
print("T1:\n", T1)
print("T2:\n", T2)
# 1D 텐서를 2D 텐서로 나누기
v = torch.div(T2, T1)
print("1D 텐서를 2D 텐서로 나눈 결과:\n", v)
실행 결과
T1:
tensor([[8., 7.],
[4., 5.]])
T2:
tensor([10., 5.])
1D 텐서를 2D 텐서로 나눈 결과:
tensor([[1.2500, 0.7143],
[2.5000, 1.0000]])
결과 텐서가 2D 형태임을 알 수 있습니다. 이는 낮은 차원의 텐서가 더 높은 차원의 텐서에 맞춰 자동으로 브로드캐스팅되기 때문입니다.
예제 4 – 2D 텐서를 2D 텐서로 나누기
다음 파이썬 프로그램은 2D 텐서를 2D 텐서로 나누는 방법을 보여줍니다.
# 필요한 라이브러리 임포트
import torch
# 두 개의 2D 텐서 생성
T1 = torch.Tensor([[8,7],[3,4]])
T2 = torch.Tensor([[0,3],[4,9]])
# 위 텐서들 출력
print("T1:\n", T1)
print("T2:\n", T2)
# T1을 T2로 나누기
v = torch.div(T1,T2)
print("요소별 나눗셈 결과:\n", v)
실행 결과
T1:
tensor([[8., 7.],
[3., 4.]])
T2:
tensor([[0., 3.],
[4., 9.]])
요소별 나눗셈 결과:
tensor([[ inf, 2.3333],
[0.7500, 0.4444]])
정리 및 참고 사항
- 0으로 나누더라도 오류가 발생하지 않으며, 해당 위치에는 inf(무한대) 값이 반환됩니다. (예제 4의 첫 번째 요소 참고)
- torch.div() 대신 / 연산자(예: t / 4, T1 / T2)를 사용해도 동일한 결과를 얻을 수 있습니다.
- 결과 텐서의 shape(모양)는 항상 두 입력 텐서 중 더 높은 차원의 텐서를 따릅니다.