4.10.1 배열 결합 기술 (Concatenate): 조립식 기차와 쌓이는 아파트
데이터 분석을 하다 보면 여러 곳에서 수집된 파편화된 데이터 조각들을 하나로 이어 붙여야 할 때가 아주 많습니다. 예를 들어, 어제 수집한 날씨 데이터 리스트와 오늘 수집한 날씨 데이터 리스트를 하나의 큰 데이터셋으로 결합(Concat)하는 작업입니다.
파이썬 Numpy에서는 이러한 구조적 결합 작업을 파이프라인처럼 직관적으로 처리하기 위해 두 가지 강력한 시각적 비유를 제공합니다. 바로 “기차 칸 연결하기”와 “아파트 층수 올리기”입니다.
[1단계] 아파트와 기차 재료 (배열) 준비하기
본격적인 결합에 앞서, 결합의 재료가 될 배열들을 준비합니다. 각 결합 방식이 요구하는 축의 길이(행 개수 또는 열 개수)가 일치해야 함을 기억하세요.
import numpy as np
# [수평 결합용] 위아래 높이(행)가 똑같이 2층인 기차 화물칸 준비
A = np.array([[1, 2],
[3, 4]])
B = np.array([[5, 6],
[7, 8]])
# [수직 결합용] 가로 폭(열)이 똑같이 3칸 구역인 아파트 모듈 준비
C = np.array([[1, 2, 3]])
D = np.array([[4, 5, 6]])
print("기차칸 A:\n", A)
print("기차칸 B:\n", B)
print("1층 기초 공사 C:\n", C)
print("크레인으로 얹어질 2층 모듈 D:\n", D)
[실행 결과]
기차칸 A:
[[1 2]
[3 4]]
기차칸 B:
[[5 6]
[7 8]]
1층 기초 공사 C:
[[1 2 3]]
크레인으로 얹어질 2층 모듈 D:
[[4 5 6]]
(참고) 여기서 기차칸 A와 B는 높이(행)가 2로 동일하고, 아파트 C와 D는 너비(열)가 3으로 동일합니다.
[2단계] 옆으로 길게 결합하기: 수평 결합 (hstack)
바닥에 놓인 두 개의 데이터 블록을 조립식 장난감 기차의 화물칸처럼 옆으로 나란히(수평으로) 이어 붙입니다. 파이썬에서는 Horizontal(수평)의 앞 글자를 딴 np.hstack() 함수를 사용합니다.
핵심 룰: 두 화물칸의 위아래 높이(행의 개수)가 완벽하게 똑같아야 이음매가 흔들림 없이 연결될 수 있습니다.
# [2단계] hstack으로 수평(Horizontal) 결합!
# 주의!: 두 개의 배열을 튜플 괄호로 포장((A, B))하여 넘겨야 합니다.
train = np.hstack((A, B))
print("🚀 hstack 결합으로 쭈욱 길어진 기차:\n", train)
[실행 결과]
🚀 hstack 결합으로 쭈욱 길어진 기차:
[[1 2 5 6]
[3 4 7 8]]
결과물을 보면 원래 2x2 사이즈였던 정사각형 블록들이 옆구리 쪽으로 단단하게 합쳐져 2x4 형태의 긴 직사각형 기차가 되었습니다.
[3단계] 위아래로 쌓아 올리기: 수직 결합 (vstack)
이번에는 데이터를 지하에서부터 옥상까지 수직(위아래)으로 차곡차곡 쌓아 올립니다. 마치 건물 위로 조립식 모듈을 올리는 타워크레인과 같습니다. Vertical(수직)의 앞 글자를 딴 np.vstack() 함수가 역할을 수행합니다.
핵심 룰: 쌓이는 건물의 가로 폭 부분(열의 개수)이 서로 정확히 똑같아야 무너지지 않고 결합될 수 있습니다.
# [3단계] vstack으로 수직(Vertical) 결합!
# 위아래로 차곡차곡 건물을 올려 2층짜리 다세대 주택을 만듭니다.
apartment = np.vstack((C, D))
print("🏢 vstack 결합을 통해 완성된 번듯한 2층 아파트:\n", apartment)
[실행 결과]
🏢 vstack 결합을 통해 완성된 번듯한 2층 아파트:
[[1 2 3]
[4 5 6]]
원래 1x3 크기였던 판상형 데이터가 수직으로 병합되며 2x3 형태의 번듯한 2층 아파트 행렬로 완성되었습니다!
[주의사항] 결합 박스(Tuple) 포장 까먹지 않기 (TypeError)
초보자가 결합 함수를 사용할 때 가장 흔하게 겪는 에러는 전달 인자를 튜플 형태 ( )로 묶어서 보내지 않는 것입니다.
try:
# 에러 발생! A와 B를 독립적인 두 매개변수로 던지면 오류가 납니다.
np.hstack(A, B)
except TypeError as e:
print("❌ 에러 발생 (TypeError):", e)
[실행 결과]
❌ 에러 발생 (TypeError): hstack() takes 1 positional argument but 2 were given
꿀팁: 결합할 배열의 갯수가 몇 개든 하나로 묶어서 보내주기 위해 **항상 이중 괄호
np.hstack((A, B, C))처럼 튜플 자료형 구조로 포장 박스에 담아 전달하는 것을 잊지 마세요!