본문 바로가기
프로그래밍/Python

Python reshape 함수 - view, flatten과의 차이

by 허구의 2025. 7. 11.
728x90

데이터 분석이나 딥러닝을 하다 보면 다차원 배열의 형태를 바꾸는 일이 매우 빈번하게 발생합니다. 이때 사용하는 대표적인 함수가 바로 reshape()입니다. 해당 글에서는 reshape 함수의 기본 사용법과 view, flatten과의 차이를 자세히 설명드리겠습니다.

 

reshape 함수란?

reshape() 함수는 배열(array)의 데이터를 그대로 두고, 배열의 형태(shape)만 새롭게 바꾸는 함수입니다. 참고로, 이 함수는 Python의 대표적인 배열 라이브러리인 NumPyPyTorch에서 공통적으로 사용됩니다!

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])

 

감사합니다!

728x90