4.6.3 numpy.hstack()

4.6.3 numpy.hstack()

[수학적 의미: 종속 변수 벡터의 통폐합] 선형방정식 \(Ax = B\) 시스템을 풀기 위해, 계수만 모은 거대한 \(A\) 행렬의 맨 오른쪽 끝에 결과 벡터 \(B\)를 한 줄의 보너스 열(Column)로 찰싹 붙여서 큰 덩어리를 만드는 수학적 기법(첨가 행렬)을 구현할 때 쓰입니다.

[비유로 이해하기: 기차의 객차 확장] 배열을 햄버거 쌓듯 위로 올리는 vstack과 반대로, 기차의 꼬리에 새로운 객차를 붙이거나 스마트폰 파노라마 사진을 옆으로 쭉 이어 붙이듯 데이터를 옆(수평, Horizontal) 방향으로 나란히 결합하여 길이를 늘입니다.

다음 배열 a는 모양이 (3, 2)인 2차원 배열이다.

import numpy as np

a = np.arange(6).reshape(3, 2)
a

출력:

array([[0, 1],
       [2, 3],
       [4, 5]])

다음 배열 b는 모양이 (3, 3)인 2차원 배열이다.

b = np.arange(10, 19).reshape(3, 3)
b

출력:

array([[10, 11, 12],
       [13, 14, 15],
       [16, 17, 18]])

행이 3으로 같은 위 두 배열을 np.hstack((a, b))로 수평으로 합칠 수 있다.

np.hstack((a, b))

출력:

array([[ 0,  1, 10, 11, 12],
       [ 2,  3, 13, 14, 15],
       [ 4,  5, 16, 17, 18]])

a = np.hstack((a, b))로 수평으로 합치려면 2차원 이상의 배열 a, b가 두 번째 축을 제외하고 동일한 모양을 가져야 한다. 2차원 배열이라면 행이 같아야 한다. 1차원 배열은 무조건 수평으로 합쳐진다.

c = np.array([[10, 20], [30, 40]])
c

출력:

array([[10, 20],
       [30, 40]])

위처럼 모양이 (2, 2)인 배열 c는 (3, 3)인 배열 b와 수평으로 합칠 수 없다. 행이 다르기 때문이다.

np.hstack((a, c))

오류:

ValueError: all the input array dimensions except for the concatenation axis
must match exactly, but along dimension 0, the array at index 0 has size 3
and the array at index 1 has size 2

다음 코드처럼 1차원 배열은 원소 수에 상관없이 무조건 수평으로 합칠 수 있다.

np.hstack((np.arange(3), np.arange(10, 15)))

출력:

array([ 0,  1,  2, 10, 11, 12, 13, 14])
서브목차