데이터 분석이나 딥러닝을 하다 보면 다차원 배열의 형태를 바꾸는 일이 매우 빈번하게 발생합니다. 이때 사용하는 대표적인 함수가 바로 reshape()입니다. 해당 글에서는 reshape 함수의 기본 사용법과 view, flatten과의 차이를 자세히 설명드리겠습니다.
reshape 함수란?
reshape() 함수는 배열(array)의 데이터를 그대로 두고, 배열의 형태(shape)만 새롭게 바꾸는 함수입니다. 참고로, 이 함수는 Python의 대표적인 배열 라이브러리인 NumPy와 PyTorch에서 공통적으로 사용됩니다!
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6])
b = a.reshape(2, 3)
print(b)
# 출력:
# [[1 2 3]
# [4 5 6]]
reshape에서 -1의 의미
reshape() 함수에 -1을 넣는 것은 "남는 차원을 자동으로 계산해 달라"는 의미입니다.
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6])
b = a.reshape(-1, 3)
print(b)
# 출력:
# [[1 2 3]
# [4 5 6]]
전체 원소가 6개이고 열이 3개이므로 행은 자동으로 2로 계산됩니다. 참고로, 한 번에 하나의 -1만 사용할 수 있습니다! 예: reshape(-1, -1) → 오류 발생
예시: 이미지 데이터를 다룰 때
import numpy as np
images = np.random.rand(10, 28, 28) # 10장의 28x28 이미지
flattened = images.reshape(10, -1)
print(flattened.shape) # (10, 784)
모델 입력에 맞게 2차원으로 바꾼 예입니다. -1은 28×28 = 784로 자동 계산됩니다.
reshape vs view vs flatten 비교
PyTorch를 사용할 때는 reshape() 외에도 view(), flatten()이라는 함수도 자주 등장합니다. 이들 사이의 차이를 명확히 이해하는 것이 중요합니다.
1. reshape()
PyTorch와 NumPy에서 공통적으로 사용되며, 원하는 모양으로 배열 또는 텐서를 바꿉니다.
import torch
x = torch.arange(12)
x_reshaped = x.reshape(3, 4)
2. view()
PyTorch 전용 함수입니다. reshape과 유사하나, 반드시 연속된 메모리(contiguous)에서만 동작합니다.
x = torch.arange(12)
y = x.view(3, 4) # reshape과 동일하게 동작
# 하지만 아래와 같이 transposed 텐서에 대해서는 오류가 날 수 있습니다
z = y.T
# z.view(12) # 오류 발생: view는 contiguous 텐서만 가능
이럴 때는 z.contiguous().view(...)와 같이 contiguous()를 먼저 호출해야 합니다.
3. flatten()
배열이나 텐서를 1차원으로 평탄화할 때 사용하는 함수입니다. 특히 이미지 같은 데이터를 신경망 입력으로 바꿀 때 유용합니다.
x = torch.randn(2, 3, 4)
flat = x.flatten()
print(flat.shape) # torch.Size([24])
또는 특정 차원만 평탄화할 수도 있습니다:
x = torch.randn(2, 3, 4)
flat = x.flatten(start_dim=1)
print(flat.shape) # torch.Size([2, 12])
감사합니다!
'프로그래밍 > Python' 카테고리의 다른 글
| Python expand() 및 repeat() (16) | 2025.07.12 |
|---|---|
| Python squeeze 및 unsqueeze 함수 - view와의 차이 (4) | 2025.07.12 |
| Python ArgumentParser 정리 (16) | 2025.07.10 |
| Python pip란? pip 사용법 (12) | 2025.07.04 |
| Python venv로 가상 환경 관리하는 방법 (2) | 2025.07.03 |