HOWTO · NumPy
Python에서 3D 배열을 2D 배열로 변환
NumPy 패키지의 reshape() 함수는 파이썬에서 3D 배열을 2D 배열로 변환하는 데 사용할 수 있습니다.
이 페이지의 내용
NumPy의 numpy.reshape()을 사용하면 배열의 값을 유지하면서 3차원 배열을 2차원 배열로 변환할 수 있습니다. 입력 배열과 원소 수가 같도록 두 차원의 곱을 정하세요. 예를 들어 형태가 (4, 2, 2)인 배열을 (4, 4)로 바꾸면 첫 번째 축의 각 그룹은 한 행에 남고, 나머지 두 축은 열로 합쳐집니다. 적절한 그룹화 방식은 데이터의 의미에 따라 달라집니다.
3차원 배열의 형태 이해하기
3차원 NumPy 배열에는 세 개의 축이 있으며, arr.shape는 각 축의 길이를 튜플로 보여 줍니다. 축이 반드시 깊이, 높이, 너비를 뜻하는 것은 아닙니다. 축의 의미는 데이터에 따라 정해집니다. 예를 들어 이미지 배열은 높이, 너비, 색상 채널을 축으로 사용할 수 있고, 시뮬레이션 배열은 시간, 행, 열을 축으로 사용할 수 있습니다. 형태를 바꾸기 전에 어떤 차원을 행으로 만들고 어떤 차원을 열로 합칠지 정하세요. 형태 변경은 축의 구성을 바꾸지만 값 자체는 바꾸지 않습니다.
NumPy reshape()로 3차원 배열 변환하기
원하는 행과 열의 수를 담은 튜플을 reshape()에 전달하세요. 다음 예제는 0부터 15까지의 값으로 (4, 2, 2) 배열을 만들고, 뒤쪽 두 축을 각각 묶어 열 네 개로 구성합니다.
다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import numpy as np
arr = np.arange(16).reshape(4, 2, 2)
arr_2d = arr.reshape(4, 4)
print("Input shape:", arr.shape)
print("Output shape:", arr_2d.shape)
print(arr_2d)
Input shape: (4, 2, 2)
Output shape: (4, 4)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
대상 형태 (4, 4)는 행 네 개와 열 네 개를 뜻합니다. NumPy는 선택한 인덱싱 순서에 따라 값을 유지하므로, 새 배열의 각 행은 선택한 축 구성에 맞춰 원래 값을 묶습니다. 다른 그룹화가 필요하면 대상 형태를 바꾸세요. 모든 3차원 데이터에 맞는 하나의 2차원 배열 형태가 정해져 있는 것은 아닙니다.
입력 배열에서 2차원 형태 계산하기
차원 크기가 달라질 수 있다면 값을 코드에 고정하지 말고 arr.shape에서 읽으세요. 입력 형태가 (a, b, c)이고 첫 번째 축의 각 슬라이스를 한 행으로 만들려면 출력 형태는 (a, b * c)입니다. 코드에서는 rows, height, width = arr.shape로 크기를 읽고 arr.reshape(rows, height * width)를 사용합니다. 이렇게 하면 첫 번째 축은 그대로 두고 두 번째와 세 번째 축을 합칩니다. 다른 축을 행으로 삼으려면 먼저 축을 재배열하거나 전치한 뒤 그 의미에 맞는 출력 형태를 정하세요.
arr.reshape(arr.shape[0], -1)처럼 한 차원에 -1을 지정하면 NumPy가 나머지 차원을 계산하게 할 수도 있습니다. NumPy는 전체 원소 수와 지정된 차원의 크기를 바탕으로 해당 차원을 구합니다. 대상 형태가 모호해지지 않도록 추론할 차원은 하나만 지정하세요.
원소 순서: C 방식과 Fortran 방식
기본적으로 reshape()는 C 방식의 인덱싱 순서를 사용합니다. 즉, 입력에서 값을 읽어 결과에 배치할 때 마지막 축이 가장 빠르게 변합니다. order='F'를 전달하면 첫 번째 축이 가장 빠르게 변하는 Fortran 방식의 인덱싱 순서를 사용합니다. order 인수는 형태를 바꿀 때 사용할 인덱싱 순서를 제어하며, 그 자체로 특정한 물리적 메모리 배치를 보장하지는 않습니다. 대부분의 변환에는 기본값을 사용하면 됩니다. 결과의 값 순서가 Fortran 방식이어야 할 때만 해당 순서를 선택하세요.
형태 호환성과 흔한 오류
입력 차원의 곱과 요청한 출력 차원의 곱은 같아야 합니다. (4, 2, 2) 입력에는 원소가 16개 있으므로 (4, 4)나 (2, 8)에는 같은 값을 담을 수 있지만 (4, 5)에는 담을 수 없습니다. 요청한 형태의 원소 수가 맞지 않으면 NumPy는 ValueError를 발생시킵니다. 이 오류를 진단할 때는 arr.size를 확인하거나 차원별 곱을 계산하세요. 또한 선택한 행과 열의 그룹화가 데이터의 의미에 맞는지도 확인해야 합니다. 수학적으로 호환되는 형태라도 다음 연산에 적합하지 않은 방식으로 값이 배열될 수 있습니다.
함수의 매개변수와 동작은 공식 NumPy reshape API 참조에서 확인할 수 있습니다.