np.random.choice 공부해보기
이번에 semi supervised learning의 대표 모델인 FixMatch 코드를 공부하는 도중 np.random.choice 함수를 만났다. 이전에 본적 있지만 그냥 넘어갔는데 확실히 공부해보려고 한다. https://numpy.org/doc/stable/reference/random/generated/numpy.random.choice.html
numpy.random.choice — NumPy v1.25 Manual
If a is an int and less than zero, if a or p are not 1-dimensional, if a is an array-like of size 0, if p is not a vector of probabilities, if a and p have different lengths, or if replace=False and the sample size is greater than the population size
numpy.org
해당 함수는 랜덤 샘플링을 할 때 사용되는 함수이다. 복원추출, 비복원추출은 파라미터 설정으로 가능하다.
우선 예시를 통해 먼저 보자.
lists = np.array([1,2,7,8,9])
for i in range(5):
print(np.random.choice(lists, 3, False))
[9 7 2]
[7 8 1]
[1 2 7]
[1 9 2]
[7 9 1]
첫번째 파라미터는 list를 받는다. 나는 1,2,7,8,9 가 들어간 리스트를 주었다. 그리고 두번째 파라미터로는 추출할 원소의 개수를 적는다. 나는 3개를 적었다. 그리고 3번째 파라미터는 비복원 추출, 복원추출할지의 여부이다. 기본값은 True이며 복원추출을 하는 것이며 False는 비복원 추출이다.
lists = np.array([1,2,7,8,9])
for i in range(5):
print(np.random.choice(lists, 3, True))
[7 2 2]
[2 9 2]
[1 7 1]
[7 7 2]
[9 1 8]
이렇게 세번째 파라미터를 True로 줄 경우 똑같은 원소가 나올 수 있다. 그리고 네번째 파라미터도 있는데 이는 해당 원소들의 추출될 확률을 부여한다.
lists = np.array([1,2,7,8,9])
for i in range(5):
print(np.random.choice(lists, 3, True, p = [0.9, 0, 0, 0, 0.1]))
[1 1 1]
[1 1 1]
[1 1 1]
[1 1 1]
[1 1 1]
만약 비복원 추출하는데 남은 원소들의 확률이 0이라면?
ValueError: Fewer non-zero entries in p than size
이러한 에러가 뜬다.
그리고 꼭 리스트를 원소를 주지 않고 숫자로도 줄 수 있다.
for i in range(5):
print(np.random.choice(10, 3, False))
[8 0 5]
[0 4 8]
[5 4 2]
[8 2 3]
[8 5 3]
가볍게 알아보는 np.random.choice정리 끝!