numpy.reshape() 함수는 배열의 데이터를 변경하지 않고 새로운 형태(shape)를 지정하는 함수입니다. 데이터 전처리나 딥러닝 모델 입력 준비처럼 배열의 차원 구조를 바꿔야 할 때 가장 많이 사용되는 NumPy 함수 중 하나입니다.
numpy.reshape(arr, newshape, order='C')
매개변수
numpy.reshape() 함수는 아래와 같은 매개변수를 받습니다.
arr - 형태를 변경할 입력 배열입니다.
newshape - 새로 지정할 형태입니다. 정수를 전달하면 해당 길이의 1차원 배열이 되고, 튜플을 전달하면 다차원 배열이 됩니다. 이때 한 개 차원은
-1로 지정할 수 있으며, 나머지 차원 크기와 전체 요소 수를 기준으로 자동 계산됩니다.order - 입력 배열의 요소를 어떤 순서로 읽고 쓸지 결정합니다.
'C' - C 언어 스타일 인덱스 순서입니다. 마지막 축 인덱스가 가장 빠르게 변하고 첫 번째 축 인덱스는 가장 느리게 변합니다. (기본값)
'F' - Fortran 스타일 인덱스 순서입니다. 첫 번째 축 인덱스가 가장 빠르게 변하고 마지막 축 인덱스는 가장 느리게 변합니다.
'A' - 배열이 메모리상에서 Fortran 연속(Fortran-contiguous)이면 'F' 순서로, 그렇지 않으면 'C' 순서로 요소를 읽고 씁니다.
예제 1: 2차원 배열의 형태 변경
다음 예제는 2×3 배열을 3×2 배열로 변형합니다. 두 번째 차원을 -1로 지정해 자동 계산되도록 했습니다.
# numpy 임포트
import numpy as np
# 입력 배열 생성
x = np.array([[3,5,6], [7,8,9]])
print('배열 입력 :\n', x)
# reshape() 함수 적용
y = np.reshape(x, (3, -1))
print('변형된 배열: \n', y)
실행 결과
배열 입력 : [[3 5 6] [7 8 9]] 변형된 배열: [[3 5] [6 7] [8 9]]
전체 요소는 6개이고 첫 번째 차원을 3으로 지정했으므로, -1로 표시된 두 번째 차원은 자동으로 2로 계산되어 3×2 배열이 생성됩니다.
예제 2: order 옵션으로 1차원 배열 만들기
이번에는 newshape에 정수를 전달하고 order='C' 옵션을 사용해 2차원 배열을 1차원 배열로 펼쳐 보겠습니다.
# numpy 임포트
import numpy as np
# 입력 배열 생성
x = np.array([[1,3,4], [4,6,7]])
print('배열 입력 :\n', x)
# reshape() 함수 적용 (order='C')
y = np.reshape(x, 6, order='C')
print('변형된 배열: \n', y)
실행 결과
배열 입력 : [[1 3 4] [4 6 7]] 변형된 배열: [1 3 4 4 6 7]
order='C'가 기본값이므로 행 우선(row-major) 순서대로 요소가 나열되어 [1 3 4 4 6 7]이 출력됩니다. 만약 order='F'를 사용했다면 열 우선(column-major) 순서로 [1 4 3 6 4 7]이 출력됩니다.
정리
numpy.reshape()는 가능한 한 원본 데이터의 뷰(view)를 반환하므로 메모리를 효율적으로 사용할 수 있습니다. 또한 x.reshape(...)처럼 ndarray 객체의 메서드 형태로도 동일하게 호출할 수 있습니다. 단, 반환되는 배열의 형태만 달라질 뿐 원본 데이터의 값과 순서는 절대 변경되지 않는다는 점을 기억하세요.