4.10.7 결론: row_stack() vs vstack()
1. 1차원 배열 처리 원리 비교
1.1 수학적 관점: 왜 얜 1차원을 넣어도 오류가 안 날까?
앞선 챕터에서 우리는 1차원 특성 데이터를 무턱대고 수평 결합하려다 hstack이 차원 불일치 에러를 뿜어내어 column_stack을 구세주처럼 사용해야 했던 과정을 살펴보았습니다.
그런데 반대로 수직(위아래) 방향으로 병합할 때는, 왜 1차원 관측치 리스트를 vstack에 거르지 않고 통째로 던져 넣어도 차원 에러가 터지지 않고 견고할까요?
수학적 이유: vstack과 row_stack 두 패밀리 함수 내부에는, 입력된 데이터 묶음 중 1차원 스칼라 배열이 감지될 경우 이를 곧장 $1 \times N$ 의 형태를 띠는 명확한 2차원 행 벡터(Row Vector) 로 차원 승급(Promotion)시켜버리는 스마트 제어 로직이 완벽하게 공통 내장되어 있기 때문입니다. 즉, 단순 1차원 리스트([1, 2, 3])를 넘겨도 Numpy 엔진이 이를 알아서 두께가 1인 얇은 판막 행렬([[1, 2, 3]])로 인식한 뒤 접합시킵니다.
1.2 실전 의문: 과연 둘을 구분해 쓸 이유가 있을까?
그렇다면 2차원 데이터프레임 밑에 1차원 관측치 행 데이터를 새로 적층해보는 코드 실험을 통해, 현업 실무에서 수직 결합 시 굳이 vstack과 row_stack 두 개를 구태여 나눠서 사용해야 할 합당한 명분이 있는지 직접 확인해 봅시다.
2. 실전 병합 테스트 과정
2.1 [1단계] 2차원 배열과 1차원 배열의 수직 결합 테스트
3행 4열(3x4)의 2차원 배열 a의 밑바닥에, 원소가 4개인 1차원 배열(4,) b를 행(Row) 형태로 끼워 넣어 봅니다.
import numpy as np
a = np.arange(1, 13).reshape(3, 4)
print("배열 a (3x4):\n", a)
b = np.arange(1, 5)
print("\n배열 b (4,):", b)
[실행 결과]
배열 a (3x4):
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
배열 b (4,): [1 2 3 4]
2.2 [2단계] 결과 확인: 어느 것을 써도 내부 로직 100% 동일!
row_stack()과 vstack() 모두 개발 소스코드를 파고 들어가 보면 완벽히 동일한 실행 프로세스(Alias)를 거치기 때문에, 단 하나의 차이점이나 오류 없이 일치하게 1차원 배열을 2차원 바닥면(Row)에 깔끔히 적층시켜 냅니다.
# row_stack 으로 결합
result_row = np.row_stack((a, b))
print("\n👇 row_stack 결합 결과:\n", result_row)
# vstack 으로 결합
result_v = np.vstack((a, b))
print("\n👇 vstack 결합 결과:\n", result_v)
[실행 결과]
👇 row_stack 결합 결과:
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[ 1 2 3 4]]
👇 vstack 결합 결과:
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[ 1 2 3 4]]
3. 실무 요약 노트
[실무 꿀팁 요약]
column_stack과hstack의 극명했던 차이 효용론과 대조해 보았을 때, 수직 방향의row_stack은vstack대비 그 어떠한 문법적 우위나 수학적 혜택이 1%도 존재하지 않습니다. 말 그대로 개발자 성향에 맞춰 이름표만 다르게 붙여놓은 완벽한 껍데기(Alias) 쌍둥이입니다.따라서 실제 데이터 분석 실무나 다른 사람의 코드를 볼 때는, 타이핑이 더 짧고 직관적인
np.vstack()이 사실상 표준(De facto standard)으로 압도적으로 많이 쓰인다는 점만 기억해 두시면 됩니다!