파이토치에서 랜덤 순열 만들고 텐서 순서 섞는 법
torch.randperm()
1
torch.randperm(n)
: 은 0부터 n-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]]])