노트 :

Numpy - 1차원 변환 flatten, ravel, reshape 본문

Python

Numpy - 1차원 변환 flatten, ravel, reshape

IT_달토끼 2022. 10. 23. 13:28

머신러닝에 인풋 데이터를 집어넣을 때, 1차원으로 변환해주어야 할 때가 있다.

 

그럴 때, flatten() 메소드를 사용한다.

array_2d = np.array([[1, 2, 3], [4, 5, 6]])
array_1d = array_2d.flatten()
print('array_2d:\n {0}, \n array_1d: \n {1}'.format(array_2d, array_1d))

flatten() 메소드처럼 다차원을 1차원으로 변환해주는 메소드로 ravel()과 reshape()이 있다.

 

그러나 ravel()과 reshape()을 사용할 때는 주의해야할 점이 있다.

 

 

확인을 위해 array_1d의 첫번째 요소를 1에서 11로 변경해 보자.

그 후 array_1d와 오리지널 배열인 arry_2d를 함께 출력해보자.

array_1d[0] = 11
print('array_1d: \n {0}, \n array_2d: \n {1}'.format(array_1d, array_2d))

array_1d만 변경된 것을 알 수 있다.

 

 

이제, ravle()메소드를 사용해보자.

array_2d_ravel = np.array([[7, 8, 9], [10, 11, 12]])
array_1d_ravel = array_2d_ravel.ravel()
print('array_2d_ravle:\n {0}, \n array_1d_ravel: \n {1}'.format(array_2d_ravel, array_1d_ravel))
print()
array_1d_ravel[1] = 88
print('array_1d_ravel: \n {0}, \n array_2d_ravel: \n {1}'.format(array_1d_ravel, array_2d_ravel))

ravel()메소드를 사용해도, flatten()메소드처럼 1차원으로 변환이 잘 되는 모습이다.

그런데!

나는 1차원 배열인 array_1d_ravel만 변경했는데 오리지널 배열인 array_2d_ravel도 같이 변경이 되었다.

이는 ravel()메소드를 사용한 배열은 오리지널 배열과 같은 메모리 공간을 공유하기 때문이다.

이제 array_1d_ravel을 변경하여도, array_2d_ravel을 변경하여도 양쪽 다 변경이 될 것이다.

 

reshape()메소드도 ravel()메소드와 같은 결과를 보여준다.

아래 코드에서 reshape()메소드에 인자로 -1을 넣어주면, 원소의 형태와 관계없이 알아서 1차원으로 변환해준다.

array_2d_reshape = np.array([[13, 14, 15], [16, 17, 18]])
array_1d_reshape = array_2d_reshape.reshape(-1)
print('array_2d_reshape:\n {0}, \n array_1d_reshape: \n {1}'.format(array_2d_reshape, array_1d_reshape))
print()
array_1d_reshape[2] = 1515
print('array_1d_reshape: \n {0}, \n array_2d_reshape: \n {1}'.format(array_1d_reshape, array_2d_reshape))

 

이처럼, flatten(), ravel(), reshape()는 모두 다차원 배열을 1차원 배열로 바꾸어주는 유용한 함수이지만 그 특성에 따라 사용할 때 잘 구분해서 사용해주어야 한다.