[Python] 구조의 재배열, numpy.reshape 함수

업데이트:

1. 배열과 차원을 변형해주는 reshape

jpg

reshape함수는 np.reshape(변경할 배열, 차원) 또는 배열.reshape(차원)으로 사용 할 수 있으며, 현재의 배열의 차원(1차원,2차원,3차원)을 변경하여 행렬을 반환하거나 하는 경우에 많이 이용되는 함수이다.

1-1. 1차원과 2차원 변환

먼저 1차원 배열을 생성하고 변환해보자.
배열은 넘파이의 array말고도 리스트 등도 올 수 있다.

import numpy as np
a = [1,2,3,4,5,6,7,8]
b = np.reshape(a,(2,4))
c = np.reshape(a,(4,2))
print(b)
print('\n')
print(c)
[[1 2 3 4]
 [5 6 7 8]]


[[1 2]
 [3 4]
 [5 6]
 [7 8]]

차원은 대괄호의 개수로 알수도 있다.

1-2. 3차원 변환

a = np.arange(1,9)
b = a.reshape(2,2,2)
b
array([[[1, 2],
        [3, 4]],

       [[5, 6],
        [7, 8]]])
b[0]
array([[1, 2],
       [3, 4]])

3차원에서 첫 번째 행렬의 1행 2열 값 인덱싱

b[0][0,1]
2


2. reshape에서 -1의 의미

reshape를 활용하는 경우를 보다 보면 입력인수로 -1이 들어간 경우가 종종 있다.
reshape()의 ‘-1’이 의미하는 바는, 변경된 배열의 ‘-1’ 위치의 차원은 “원래 배열의 길이와 남은 차원으로 부터 추정”이 된다는 뜻이다.

말이 좀 어려우나 차근차근 알아보자.
일단 배열을 하나 생성.

x = np.arange(12)
x = x.reshape(3,4)
x
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

2-1. reshape(-1,정수) : 행의 위치에 -1인 경우

x.reshape(-1,1)
array([[ 0],
       [ 1],
       [ 2],
       [ 3],
       [ 4],
       [ 5],
       [ 6],
       [ 7],
       [ 8],
       [ 9],
       [10],
       [11]])
x.reshape(-1,2)
array([[ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11]])
x.reshape(-1,3)
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])

즉, 행(row)의 위치에 -1을 넣고 열의 값을 지정해주면 변환될 배열의 행의 수는 알아서 지정이 된다는 소리이다.

2-2. reshape(정수,-1) : 열의 위치에 -1인 경우

x.reshape(1,-1)
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]])
x.reshape(2,-1)
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])
x.reshape(3,-1)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
x.reshape(4,-1)
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])

이것도 마찬가지로, 이번엔 행(row)의 수를 지정해주면 열은 알아서 자동으로 재배열을 해주는 것이다.

2-3. reshape(-1)인 경우

x.reshape(-1)
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
x.reshape(1,-1)
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]])

-1만 들어가면 1차원 배열을 반환한다. 모양상 x.reshape(1,-1)과 같으나 이는 (1,12)인 2차원 배열이다.(대괄호의 수로 확인 가능하다.)



Reference

여기를 참조하여 포스팅하였습니다.

댓글남기기