Home [PyTorch] Tensor Manipulation2
Post
Cancel

[PyTorch] Tensor Manipulation2

Other asic Ops

1
2
import numpy as np
import torch

View(Reshape)

  • view 함수는 NumPy에서 reshape 함수와 같은 역할을 한다.
  • shape를 다시 만들어준다.
1
2
3
4
5
6
7
8
9
10
11
t = np.array([[[0, 1, 2],
              [3, 4, 5]],
              
              [[6, 7, 8],
               [9, 10, 11]]
              ])

ft = torch.FloatTensor(t)

print(ft)
print(ft.shape)
1
2
3
4
5
6
tensor([[[ 0.,  1.,  2.],
         [ 3.,  4.,  5.]],

        [[ 6.,  7.,  8.],
         [ 9., 10., 11.]]])
torch.Size([2, 2, 3])
1
2
3
# (2, 2, 3)에서 2 x 2 = 4가 되어 (4, 3)
print(ft.view([-1, 3])) # 앞은 모르겠고(-1), 두 번쨰 차원은 3개의 element를 가짐(3)
print(ft.view([-1, 3]).shape)
1
2
3
4
5
tensor([[ 0.,  1.,  2.],
        [ 3.,  4.,  5.],
        [ 6.,  7.,  8.],
        [ 9., 10., 11.]])
torch.Size([4, 3])
1
2
3
4
5
# 첫 번째 dimension은 모르겠다.
# 1, 3에 맞춰서 바꾼다.
# (2, 2, 3)에서 2 x 2 = 4가 되어 (4, 1, 3)이 된다.
print(ft.view([-1, 1, 3]))
print(ft.view([-1, 1, 3]).shape)
1
2
3
4
5
6
7
8
tensor([[[ 0.,  1.,  2.]],

        [[ 3.,  4.,  5.]],

        [[ 6.,  7.,  8.]],

        [[ 9., 10., 11.]]])
torch.Size([4, 1, 3])

Squeeze

  • 쥐어 짜내는 것을 의미한다.
  • 결과적으로는 view 함수를 사용한 것과 같다.
  • view 함수와 다른 경우는 squeeze는 자동으로 dimension의 element가 1인 경우 없애준다.
  • squeeze(dim=)를 사용할 경우 해당 dimension에 1이 있을 경우 없애준다.
1
2
3
ft = torch.FloatTensor([[0], [1], [2]])
print(ft)
print(ft.shape)
1
2
3
4
tensor([[0.],
        [1.],
        [2.]])
torch.Size([3, 1])
1
2
3
4
# 1이 날라간 것을 확인
print(ft.squeeze())
print(ft.squeeze(dim=1).shape)
print(ft.squeeze().shape)
1
2
3
tensor([0., 1., 2.])
torch.Size([3])
torch.Size([3])

Unsqueeze

  • 내가 원하는 dimension에 1을 넣어준다.
  • dimension을 반드시 명시해주어야 한다.
1
2
3
4
ft = torch.Tensor([0, 1, 2]) # Vector
print(ft.dim())
print(ft)
print(ft.shape)
1
2
3
1
tensor([0., 1., 2.])
torch.Size([3])
1
2
3
# demension=0에 1을 넣어준다.
print(ft.unsqueeze(dim=0))
print(ft.unsqueeze(dim=0).shape)
1
2
tensor([[0., 1., 2.]])
torch.Size([1, 3])
1
2
3
# view를 통해 위와 똑같은 결과를 나타냄
print(ft.view([1, -1]))
print(ft.view([1, -1]).shape)
1
2
tensor([[0., 1., 2.]])
torch.Size([1, 3])
1
2
3
# dimension=1에 1을 넣어준다.
print(ft.unsqueeze(1))
print(ft.unsqueeze(1).shape)
1
2
3
4
tensor([[0.],
        [1.],
        [2.]])
torch.Size([3, 1])
1
2
3
# dimension=-1은 마지막 dimension을 나타낸다.
print(ft.unsqueeze(dim=-1))
print(ft.unsqueeze(dim=-1).shape)
1
2
3
4
tensor([[0.],
        [1.],
        [2.]])
torch.Size([3, 1])

Type Casting

1
2
3
4
lt = torch.LongTensor([1, 2, 3, 4])
print(lt.dim())
print(lt)
print(lt.shape)
1
2
3
1
tensor([1, 2, 3, 4])
torch.Size([4])
1
print(lt.float()) # 소수형
1
tensor([1., 2., 3., 4.])
1
2
3
# True=1, False=0
bt = torch.ByteTensor([True, False, False, True])
print(bt)
1
tensor([1, 0, 0, 1], dtype=torch.uint8)
1
2
print(bt.long()) # 정수형
print(bt.float()) # 실수형
1
2
tensor([1, 0, 0, 1])
tensor([1., 0., 0., 1.])

Concatenate

이어 붙이는 함수이다.

1
2
x = torch.FloatTensor([[1, 2], [3, 4]])
y = torch.FloatTensor([[5, 6], [7, 8]])
1
2
3
print(x.dim())
print(x)
print(x.shape)
1
2
3
4
2
tensor([[1., 2.],
        [3., 4.]])
torch.Size([2, 2])
1
2
3
print(y.dim())
print(y)
print(y.shape)
1
2
3
4
2
tensor([[5., 6.],
        [7., 8.]])
torch.Size([2, 2])
1
2
3
4
5
6
7
# dimension=0에 대해서 concate
# x=(2 x 2), y=(2 x 2) -> (4 x 2)
print(torch.cat([x, y], dim=0))

# dimension=1에 대해서 concate
# x=(2 x 2), y=(2 x 2) -> (2 x 4)
print(torch.cat([x, y], dim=1))
1
2
3
4
5
6
tensor([[1., 2.],
        [3., 4.],
        [5., 6.],
        [7., 8.]])
tensor([[1., 2., 5., 6.],
        [3., 4., 7., 8.]])

Stacking

쌓아올리다.

1
2
3
x = torch.FloatTensor([1, 4])
y = torch.FloatTensor([2, 5])
z = torch.FloatTensor([3, 6])
1
2
print(torch.stack([x, y, z]))
print(torch.stack([x, y, z], dim=1))
1
2
3
4
5
tensor([[1., 4.],
        [2., 5.],
        [3., 6.]])
tensor([[1., 2., 3.],
        [4., 5., 6.]])

Ones and Zeros

1
2
3
4
x = torch.FloatTensor([[0, 1, 2], [2, 1, 0]]) # 2 x 3 tensor
print(x)
print(x.dim()) # matrix
print(x.shape)
1
2
3
4
tensor([[0., 1., 2.],
        [2., 1., 0.]])
2
torch.Size([2, 3])
1
2
3
# device도 똑같이 된다.
print(torch.ones_like(x))
print(torch.zeros_like(x))
1
2
3
4
tensor([[1., 1., 1.],
        [1., 1., 1.]])
tensor([[0., 0., 0.],
        [0., 0., 0.]])

In-place Operation

1
x = torch.FloatTensor([[1, 2], [3, 4]])
1
2
3
4
5
6
print(x.mul(2.)) # x * 2
print(x)

# 메모리에 새로 선언하지 않고 정답값을 기존의 텐서에 넣는다.
print(x.mul_(2.))
print(x)
1
2
3
4
5
6
7
8
tensor([[2., 4.],
        [6., 8.]])
tensor([[1., 2.],
        [3., 4.]])
tensor([[2., 4.],
        [6., 8.]])
tensor([[2., 4.],
        [6., 8.]])

Zip

1
2
for x, y in zip([1, 2, 3], [4, 5, 6]):
    print(x, y)
1
2
3
1 4
2 5
3 6
1
2
for x, y, z in zip([1, 2, 3], [4, 5, 6], [7, 8, 9]):
    print(x, y, z)
1
2
3
1 4 7
2 5 8
3 6 9
This post is licensed under CC BY 4.0 by the author.