Python/Numpy

📚 쌓을까? 붙일까? NumPy stack() vs concatenate() 완전정복 😎

THINKRUNNER 2025. 5. 4. 21:42
쌓을까? 붙일까? NumPy stack() vs concatenate() 완전정복 😎

📚 쌓을까? 붙일까? NumPy stack() vs concatenate() 완전정복 😎

오랜 시간 고민하고, 실수도 해보고, 질문도 여러 번 해본 끝에 드디어 NumPy 배열 연결의 세계를 이해하게 되었습니다! 🎉

이번 글에서는 제가 실제로 공부하며 생긴 궁금증과 이해 과정을 바탕으로, concatenate()stack()의 개념을 예시와 함께 최대한 쉽게 정리해보겠습니다!

1. 🤯 처음엔 헷갈렸어요

처음엔 axis라는 말도 어렵고, stack은 왜 자꾸 차원을 늘리는지 이해가 안 갔습니다.

심지어 np.stack((a, b), axis=2) 결과를 손으로 계산하다 실수도 했죠 😂 하지만 그 실수 덕분에 개념이 더 확실해졌습니다.

2. 🧻 concatenate() - 축을 기준으로 배열 연결하기

concatenate는 아주 단순합니다. “붙이기만 한다!”

concatenate는
👉 "그 축을 기준으로 이어붙이기"
👉 "차원은 그대로 유지됨"

📌 예시:

a = [[1, 2], [3, 4]]
b = [[5, 6], [7, 8]]

np.concatenate((a, b), axis=0)
# 결과: [[1 2], [3 4], [5 6], [7 8]] → shape: (4, 2)

np.concatenate((a, b), axis=1)
# 결과: [[1 2 5 6], [3 4 7 8]] → shape: (2, 4)

주의: 연결하려는 배열들은 차원 수가 같아야 하고, 연결하지 않는 축의 크기도 같아야 합니다.

3. 📦 stack() - 새로운 축을 만들어 덩어리로 쌓기

stack은 concatenate와 달리, “비집고 들어가서” 새로운 축이 생깁니다.

stack은
👉 "차원을 하나 늘린다"
👉 "묶어서 쌓는다 (덩어리 개념)"
👉 "shape이 (N, ...) → (K, N, ...) 이런 식으로 됨"

📌 예시:

a = [[1, 2], [3, 4]]
b = [[5, 6], [7, 8]]

np.stack((a, b), axis=0)
# 결과: shape (2, 2, 2) → 덩어리 2개

np.stack((a, b), axis=1)
# 결과: shape (2, 2, 2) → 각 행끼리 [a, b] 묶기

np.stack((a, b), axis=2)
# 결과: shape (2, 2, 2) → 각 값 위치별로 [a, b] 묶기

4. ⚔️ concatenate vs stack 비교

기능concatenatestack
차원 수 변화변화 없음차원 +1
축 지정 의미어디로 붙일지어디에 새 축을 넣을지
기본 예시(2,2)+(2,2) → (4,2) or (2,4)(2,2)+(2,2) → (2,2,2)

5. 🤹 배열이 3개 이상이면?

당연히 가능합니다! 배열이 여러 개일 때도 concatenate()stack() 모두 OK!

a = [[1, 2], [3, 4]]
b = [[5, 6], [7, 8]]
c = [[9, 10], [11, 12]]

np.concatenate((a, b, c), axis=1)  # shape: (2, 6)

np.stack((a, b, c), axis=0)  # shape: (3, 2, 2)
np.stack((a, b, c), axis=1)  # shape: (2, 3, 2)
np.stack((a, b, c), axis=2)  # shape: (2, 2, 3)

stack은 합치는 배열 개수만큼 원하는 축으로 밀어 넣기! 결국 비집고 들어가니까 한 축이 더 생긴다는 걸 기억하세요.

6. ✅ 마무리 정리

💡 내가 이해한 정리 문장
stack()은
👉 “합치는 배열 개수만큼 원하는 축으로 밀어 넣기!”
👉 “결국 비집고 들어가니까 한 축 더 생김!”

concatenate()는
👉 “그냥 배열들을 연결만 하기, 축 지정 시 축을 기준으로 붙이기!”