[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