HOWTO · NumPy
NumPy의 numpy.random.permutation() 함수
numpy.random.permutation() 함수는 배열의 무작위로 순열된 복사본을 반환하거나, 정수가 주어지면 순열된 정수 범위를 반환하며, 원본 데이터는 변경하지 않습니다. 이는 배열을 제자리에서 섞는 numpy.random.shuffle()와 다릅니다.
이 페이지의 내용
numpy.random.permutation()은 시퀀스를 무작위로 순열하거나 순열된 범위를 반환합니다. 배열을 전달하면 그 배열의 섞인 복사본을 반환하며, 원본은 정확히 그대로 남습니다. 정수 n을 전달하면 0부터 n - 1까지의 정수를 무작위 순서로 반환합니다. 수정이 아닌 복사라는 이 동작이 배열을 제자리에서 섞는 numpy.random.shuffle()와의 차이의 전부입니다.
원본을 변경하지 않고 배열 순열하기
배열의 경우 permutation()은 동일한 요소를 무작위 순서로 담은 새 배열을 만듭니다.
import numpy as np
original_array = np.array([1, 2, 3, 4, 5])
shuffled_array = np.random.permutation(original_array)
print("Original Array:", original_array)
print("Shuffled Array:", shuffled_array)
출력:
Original Array: [1 2 3 4 5]
Shuffled Array: [3 1 5 2 4]
shuffled_array의 순서는 무작위이므로 위의 출력은 가능한 결과 중 하나이며, 모든 실행이 생성하는 결과가 아닙니다. 변하지 않는 것은 original_array입니다. 여전히 [1 2 3 4 5]를 담고 있으며, 이는 원래 순서가 나중에도 중요할 때, 예를 들어 데이터셋이 레이블과 정렬된 상태를 유지해야 할 때 permutation()이 올바른 선택이 되는 이유입니다.
정수의 경우 permutation()은 순열된 범위를 반환하는데, 이는 무작위 인덱스를 얻는 편리한 방법입니다.
import numpy as np
n = 5
permuted_indices = np.random.permutation(n)
print("Permuted Indices:", permuted_indices)
출력:
Permuted Indices: [4 0 2 3 1]
여기서도 정확한 순서는 실행마다 다릅니다. 정수를 전달하는 것은 np.arange(n)으로 먼저 범위를 만든 다음 그 배열을 순열하는 것과 동일합니다.
permutation()와 shuffle() 비교
두 함수는 반환하는 것과 데이터에 하는 일이 다릅니다. permutation()은 새 배열을 반환하고 입력에는 결코 손대지 않습니다. numpy.random.shuffle()은 아무것도 반환하지 않고 배열 자체를 제자리에서 재정렬합니다.
import numpy as np
original_array = np.array([1, 2, 3, 4, 5])
np.random.shuffle(original_array)
print("Shuffled Original Array:", original_array)
출력:
Shuffled Original Array: [2 5 1 4 3]
이 호출 이후에는 원래 순서가 사라집니다. 원래 순서가 필요 없고 제자리에서 재정렬하고 싶다면 shuffle()을 선택하고, 원본이 남아 있어야 한다면 permutation()을 선택하세요. 복사의 실질적인 결과 중 하나는, 대규모 데이터셋에서는 permutation()이 두 번째 배열을 위한 메모리를 필요로 한다는 점입니다. 따라서 데이터가 클 경우 그 편의성과 추가 메모리를 저울질하세요.