Python/Numpy

[Numpy] 배열 shape 변경 : np.reshape 함수 사용법, -1 의미

jimmy_AI 2022. 1. 13. 15:37
반응형

파이썬 넘파이 배열 차원 변경 함수 : np.reshape

reshape 함수를 통하여 넘파이 배열의 차원을 변환하는 방법에 대해서 살펴보고,

함수 내 input으로 -1을 포함한 경우의 의미도 살펴보도록 하겠습니다.

 

 

np.reshape 함수 기본 사용법

기본적인 사용 방법은 배열 a에 대하여

a.reshape(변환 shape) 혹은 np.reshape(a, 변환 shape)

형태로 사용해주시면 됩니다.

 

axis 순서대로(가로 -> 세로 축 방향) 값들을

변환되는 shape으로 재배정하는 원리이며,

재배정이 불가능한 shape인 경우 ValueError가 발생합니다.

 

1차원 배열에 대한 실행 예제입니다.

import numpy as np

a = np.arange(9)
# array([0, 1, 2, 3, 4, 5, 6, 7, 8])

a.reshape(3, 3) # np.reshape(a, (3, 3))으로도 사용 가능
'''array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])'''

a.reshape(2, 5) 
# ValueError: cannot reshape array of size 9 into shape (2,5)
# 2 * 5가 9가 아니라서 발생

9개의 요소를 가진 1차원 배열을 3 * 3 배열로 변경이 가능합니다.

 

다만, (2, 5)의 shape으로는 9개의 요소를 표현할 수 없어 에러가 발생합니다.

 

 

reshape 함수 -1의 의미

특정 차원의 숫자로 -1을 넣는 경우도 자주 등장합니다.

 

-1을 넣은 자리에는 가능한 shape을 자동 계산하여 반영해주는 방식으로,

예를 들어, 8개의 사이즈에서 reshape(2, -1)로 넣으면,

(2, 4)로 자동 변환되는 방식입니다.

 

단, 2개 이상의 axis 자리에 -1이 포함되는 것은 불가능합니다.

 

2차원 배열을 통한 예제를 살펴보도록 하겠습니다.

b = np.array([[1, 2, 3, 4],
              [5, 6, 7, 8]])

b.reshape(2, 2, 2) # b.reshape(2, 2, -1)와 동일
'''array([[[1, 2],
        [3, 4]],

       [[5, 6],
        [7, 8]]])'''

b.reshape(-1, 2) # b.reshape(4, 2)와 동일
'''array([[1, 2],
       [3, 4],
       [5, 6],
       [7, 8]])'''

b.reshape(-1) # b.reshape(8)와 동일
# array([1, 2, 3, 4, 5, 6, 7, 8])

b.reshape(3, -1)
# ValueError: cannot reshape array of size 8 into shape (3,newaxis)
# 3 * n = 8을 만족하는 n이 정수가 아니라서 오류

reshape(-1)으로 지정하면, 모든 원소를 1차원 배열로 편 array를 반환하게 되며,

 

(3, -1) 같은 경우는 8이 3의 배수가 아니기에,

변환 가능한 차원이 없어 ValueError가 발생하게 됩니다.