넘파이에는 배열의 모양(?)을 다시 만들어주는 메소드가 있다. 바로 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개의 행에 빈 열이 없이 데이터를 분배할 수 없기때문이다.
관련 내용은 공부하면서 더 추가하자.
- 끝 -
'Programming language > Python' 카테고리의 다른 글
[Python-matplotlib] 1.matplotlib 시작하기 (0) | 2022.05.17 |
---|---|
[Python-개발환경]Python Pandas 설치하기, VSC에서 파이썬 판다스 설치하기 (0) | 2022.03.23 |
[Python-NumPy] 2.NumPy.sort() 정렬 (0) | 2022.03.02 |
[Python-NumPy] 1.NumPy 시작하기 (0) | 2022.02.22 |
[Python-개발환경] 가상환경이란? VSC에서 가상환경 설정하기 (0) | 2022.02.17 |