[Python-NumPy] 4.NumPy.reshape

728x90
반응형

넘파이에는 배열의 모양(?)을 다시 만들어주는 메소드가 있다. 바로 reshape()메소드, 배열을 "재구조화" 시키는 메소드다. 사용법을 알아보도록 하겠다. 

 

 

1. reshape 기본 사용법

우선 아래와같은 배열의 모양을 .shape()메소드를 이용해 확인해보자.

arr = np.array(range(6))
print(arr.shape)

결과는 다음과같이 (6,)가 나올것이다.  배열의 모양이 6개의 행데이터로 구성되었다는 의미다. 즉 1차원 배열을 뜻한다. 

(6,)

reshape를 이용해 arr을 2x3 배열로 만들어보자.

arr = np.array(range(6))
print(arr.reshape(2, 3))

 결과는 [ [0 1 2] [3 4 5] ] 2행 3열의 배열로 만들어진다. 

[[0 1 2]
 [3 4 5]]

아래와 같이 넘파이에서 제공하는 reshape를 사용하는 방법도 있다. 

print(np.reshape(arr, newshape=(2, 3)))

출력결과는 arr.reshape(2, 3)과 동일할 것이다. 

 

2. reshape의 전달인자에 -1이 들어가는 경우 

아래와 같이 15개의 요소를 갖는 3x5의 2차원 배열을 만들어보자.

arr = np.array(range(15)).reshape(5, 3)

print를 통해 확인해보면 출력결과는 다음과 같을것이다. 

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]

reshape 메소드의 전달인자에 -1이 들어있는 경우 메소드의 동작은 다음과 같이 설명할 수 있다. 

 

2.1 reshape(-1, 정수), 행(row)위치에 -1이 전달된 경우 

이와 같은 경우는 열 데이터의 요소 갯수는 '정수' 로 구성된다. 행의 갯수는 배열 요소/'정수' 가 된다. 위 배열 arr을 기준으로 설명하겠다. 

arr.reshape(-1, 3)

행과 열의 갯수를 정하는 전달인자에 각각 -1과 3을 전달했다. 위에서 설명한대로 배열요소/"정수"를 계산해보자. arr은 15개의 요소를 갖고 "정수"는 3이다. 

 

15/3 = 5, 행의 갯수는 5다. 즉 5x3 배열을 만든다는 의미다. print를 통해 결과를 확인해보면 다음과 같다. 

[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]
 [12 13 14]]

'정수' 위치에 2를 넣으면 어떻게될까 ? 

에러가 발생한다. 15를 2로 나누었을때 나머지가 생기기 때문이다. 즉 1개의 행에 '정수'의 수 만큼 열 데이터 요소를 갖도록 재구성한다. 단, 배열의 전체 요소값을 '정수'로 나누었을때 나누어 떨어지지 않으면(열 데이터 요소에 빈 공간이 생기면) 에러가 발생한다. 

 

 

2.2 reshape(정수, -1), 열(column)위치에 -1이 전달된 경우 

위와 반대다. 코드를 통해 확인해보자.

arr.reshape(5, -1)

결과는 다음과 같다. 

[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]
 [12 13 14]]

'정수'의 수만큼 행을 만들었다. 위와 똑같이 '정수'에 2를 넣어보자.

arr.reshape(2, -1)

위와 같이 에러가 발생할 것이다. 15개의 데이터를 2개의 행에 빈 열이 없이 데이터를 분배할 수 없기때문이다. 

 

 

 

 

관련 내용은 공부하면서 더 추가하자.

 

- 끝 - 

 

 

728x90
반응형