파이토치에서 랜덤 순열 만들고 텐서 순서 섞는 법

파이토치에서 랜덤 순열 만들고 텐서 순서 섞는 법

torch.randperm()1

>>> torch.randperm(4)
tensor([2, 1, 0, 3])

>>> torch.randperm(8)
tensor([4, 0, 1, 3, 2, 5, 6, 7])

>>> torch.randperm(16)
tensor([12,  5,  6,  3, 15, 13,  2,  4,  7, 11,  1,  0,  9, 10, 14,  8])

>>> torch.randperm(4.0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: randperm(): argument 'n' (position 1) must be int, not float

tensor[indices]

인덱스 텐서를 인덱싱하면 그에 맞게 인덱스가 바뀐다. 기준은 dim=0이다. numpy array에 대해서도 같은 식으로 가능하다.

>>> indices = torch.randperm(4)
>>> indices
tensor([1, 3, 0, 2])

>>> a = torch.tensor([1,2,3,4])
>>> a[indices]
tensor([2, 4, 1, 3])

>>> b = torch.tensor([[1,1,1],[2,2,2],[3,3,3],[4,4,4]])
>>> b[indices]
tensor([[2, 2, 2],
        [4, 4, 4],
        [1, 1, 1],
        [3, 3, 3]])

>>> c = torch.tensor([[[1,1],[1,1]],[[2,2],[2,2]],[[3,3],[3,3]],[[4,4],[4,4]]])
>>> c
tensor([[[1, 1],
         [1, 1]],

        [[2, 2],
         [2, 2]],

        [[3, 3],
         [3, 3]],

        [[4, 4],
         [4, 4]]])
>>> c[indices]
tensor([[[2, 2],
         [2, 2]],

        [[4, 4],
         [4, 4]],

        [[1, 1],
         [1, 1]],

        [[3, 3],
         [3, 3]]])

  1. https://pytorch.org/docs/stable/generated/torch.randperm.html ↩︎

댓글