프로그래밍/미분류

파이썬 넘파이를 이용한 두 배열 동시에 섞기 (Use python numpy to shuffle 2 arrays at same time)

내꿈은자동화 2017. 8. 22. 17:25

파이썬을 numpy 라이브러리를 이용하여 배열을 섞는 방법에 대해 알아보겠다.

(뭐, 다른 사람이 해놓은 것을 번역한 거라 보면 된다.)


이 방법을 사용한 이유는 머신러닝에서 데이터를 학습시킬 때 편향되지 않은 학습을 시키기 위함이다.


단순히 한 개의 배열을 섞을 때는 아래와 같은 방법을 사용한다.

import numpy as np

x = np.arange(10)
print ("x: ", x)

np.random.shuffle(x)
print ("x: ", x)


출력의 경우 매번 다르겠지만 이런 형태로 나온다.

x:  [0 1 2 3 4 5 6 7 8 9]

x:  [7 5 8 6 3 1 4 9 0 2]


두 개의 배열을 같은 순서로 섞고 싶다면 어떻게 해야할까?


아래 코드와 같이 그냥 섞으면 결과는 참담하다.

import numpy as np

x = np.arange(10)
print ("x: ", x)
y = np.arange(10)
print ("y: ", y)

np.random.shuffle(x)
print ("x: ", x)
np.random.shuffle(y)
print ("y: ", y)

x:  [0 1 2 3 4 5 6 7 8 9]

y:  [0 1 2 3 4 5 6 7 8 9]

x:  [3 6 4 7 1 8 9 2 5 0]

y:  [7 0 2 3 5 4 8 6 1 9]


같은 순서로 섞는 방법은 간단하다.

다른 배열을 하나 만들고 그 배열의 성분을 섞어줄 배열의 인덱스로 채우면 된다. (난해할 수 있다.)

아래 코드를 보자.
import numpy as np

x = np.arange(10)
print ("x: ", x)
y = np.arange(10)
print ("y: ", y)

s = np.arange(x.shape[0])
np.random.shuffle(s)

x = x[s]
print ("x: ", x)
y = y[s]
print ("y: ", y)

s라는 배열에 배열 x의 인덱스를 넣고 섞은 뒤 x, y배열에 대입한다.

결과는 아래와 같다.


x:  [0 1 2 3 4 5 6 7 8 9]

y:  [0 1 2 3 4 5 6 7 8 9]

x:  [7 2 1 9 4 5 0 3 6 8]

y:  [7 2 1 9 4 5 0 3 6 8]





참고 문헌

The Plone Expanse, https://play.pixelblaster.ro/blog/2017/01/20/how-to-shuffle-two-arrays-to-the-same-order/