[Python] 구조의 재배열, numpy.reshape 함수
업데이트:
1. 배열과 차원을 변형해주는 reshape
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
여기를 참조하여 포스팅하였습니다.
댓글남기기