torch tensor manipulation3
broadcasting
indexing & slicing
import torch
x = torch.arange(0, 256, dtype = torch.int64, device = 'cpu').float()
print(f"original x size: {x.size()}")
x_expanded = x[None, :, None, None]
print(f"expanded x size: {x_expanded.size()}")
original x size: torch.size([256])
expanded x size: torch.Size([1, 256, 1, 1])
x = torch.randn(4, 4, 7, 3)
print(x.size())
x_ = x[None, :, None, :, None, :, None, :]
print(x_.size())
torch.Size([4, 4, 7, 3])
torch.Size([1, 4, 1, 4, 1, 7, 1, 3])
None
지정해주는만큼 차원 확장가능하나 전체 인덱싱(:)은 원래 텐서 갯수만큼 할당 가능
expand
x = 10000 ** (torch.arange(0, 256, dtype = torch.int64, device = 'cpu').float() / 256)
x = x[None, :, None].float()
print(f"before slicing x shape: {x.size()}")
torch.Size([1, 256, 1])
x_expanded = x.expand(100, -1, 50)
print(f"before slicing x_expanded shape: {x_expanded.size()}")
torch.Size([100, 256, 50])
- 특정 차원의 텐서를 반복해서 생성해주는 함수이며 특정 차원의 크기가 1인 tensor에만 적용 가능
expand(-1)
: 차원유지expand(n)
: 차원의 크기가 1인 tensor에 n만큼 차원 확장
triu & tril
삼각행렬, triangular matrix
- 선형대수에서 삼각행렬은 정사각행렬의 특수한 경우로 주대각선을 기준으로 대각항의 위쪽이나 아래쪽 항들의 값이 모두 0인 경우를 의미
- 하삼각행렬(lower triangular matrix)
- 상삼각행렬(upper triangular matrix)
triu
- 상삼각행렬 만들어주는 함수
in_tensor = torch.randn(3, 3)
print(in_tensor)
tensor([[ 1.1567, 1.6308, -2.5685],
[-0.9405, -0.3915, -1.8426],
[-0.2034, 0.2296, 0.5827]])
upper_tri_matrix = torch.triu(in_tensor, diagonal = 0)
print(f"Upper triangular Matrix:\n{upper_tri_matrix}")
Upper triangular Matrix:
tensor([[ 1.1567, 1.6308, -2.5685],
[ 0.0000, -0.3915, -1.8426],
[ 0.0000, 0.0000, 0.5827]])
tril
- 하삼각행렬 만들어주는 함수
lower_tri_matrix = torch.tril(in_tensor)
print(f"Lower triangular Matrix:\n{lower_tri_matrix}")
Lower triangular Matrix:
tensor([[ 1.1567, 0.0000, 0.0000],
[-0.9405, -0.3915, 0.0000],
[-0.2034, 0.2296, 0.5827]])