Python/Numpy

NumPy reshape() 완벽 정리! 🔥 - 사용법, -1 옵션, ndim 차이까지 한 번에

THINKRUNNER 2025. 5. 1. 16:15
NumPy reshape() 완벽 정리! - 사용법, -1 옵션, ndim 차이까지 한 번에

NumPy reshape() 완벽 정리! 🔥 - 사용법, -1 옵션, ndim 차이까지 한 번에

1. reshape()란 무엇인가요? 🤔

reshape()는 배열의 모양(=shape)을 바꿀 때 사용하는 함수입니다. 배열 안의 원소의 수는 그대로 유지하면서, 다른 차원 구조로 변환할 수 있어요.

📌 한 줄 요약

reshape = 값은 그대로, 모양만 바꾼다!

2. reshape() 기본 사용법 🔧


import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6])
newarr = arr.reshape(2, 3)

print(newarr)
# 출력:
# [[1 2 3]
#  [4 5 6]]
    

6개의 원소를 2행 3열 형태로 재배치했습니다! 원소 수(6개)는 변하지 않고, 배열 모양만 바뀐 거예요.

3. reshape와 ndim의 차이 궁금했죠? 👀

- ndim은 배열이 "몇 차원"인지를 알려주는 속성.
- reshape()은 배열의 "구체적인 차원 구조"를 바꾸는 함수.

✅ 즉, ndim은 정보(info), reshape()는 행동(action)!

4. reshape()의 슈퍼 능력: -1 자동 계산 ✨

reshape을 사용할 때 -1을 넣으면, 그 자리에 필요한 크기를 NumPy가 자동으로 계산해줘요!


arr = np.array([1, 2, 3, 4, 5, 6])
newarr = arr.reshape(2, -1)

print(newarr)
# 출력:
# [[1 2 3]
#  [4 5 6]]
    

여기서 -1은 "나머지 칸은 알아서 계산해줘!" 라는 뜻입니다.
총 원소 수(6개)에서 2행을 나눴으니, 3열은 자동으로 맞춰진 거예요.

✔ 언제 -1을 사용할까?

  • 원소 수를 일일이 세기 귀찮을 때
  • 배치 크기(batch size)만 지정하고, 나머지는 자동으로 계산하고 싶을 때
  • 모델 입출력에 맞춰 유연하게 형태를 맞춰야 할 때

5. -1은 딱 한 번만 써야 한다! ❗

reshape에서는 -1을 단 하나만 사용할 수 있어요. 만약 두 개 이상의 -1을 쓰면 NumPy가 "어디를 몇 개로 나눠야 할지" 혼란스러워서 에러를 냅니다. ➔ reshape은 총 원소 수라는 하나의 방정식만 있으니, 미지수도 딱 하나만 가능해야 해요!

6. reshape는 copy가 아니라 view! 🔥

reshape은 기본적으로 값은 그대로 두고, 모양(shape)만 해석하는 방식이에요. 그래서 가능하면 새 메모리를 복사하지 않고(view) 기존 메모리를 그대로 활용합니다. ➔ 속도 빠르고, 메모리 절약!

단, 메모리 연속성(Contiguity)이 깨진 경우에는 어쩔 수 없이 copy가 생길 수도 있어요. NumPy는 기본적으로 계산 성능과 메모리 최적화를 위해 reshape을 view로 처리하는 걸 우선합니다.

7. reshape할 때 가장 중요한 규칙! 🚨

reshape할 때는 반드시 전체 원소 수가 일치해야 합니다.
(원소가 6개라면, 2x3, 3x2, 1x6, 6x1만 가능)


arr = np.array([1, 2, 3, 4, 5, 6])
# arr.reshape(4,2)  # ❌ 오류! 총 8개가 필요한데 현재는 6개뿐
    

✔ 한 줄 정리

원소 수가 안 맞으면 reshape은 무조건 에러 난다!

🎉 핵심 요약

reshape()는 NumPy 배열의 형태를 자유자재로 바꾸는 필수 도구입니다. -1 옵션으로 편리하게 차원을 맞출 수 있고, 원소 수만 일치하면 어떤 모양이든 가능합니다!

작성일: 2025-04-26