4.6.4 배열 결합 연산 column_stack()과 row_stack()

① numpy.column_stack()

다음 배열 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, 4)인 2차원 배열이다.

b = np.arange(10, 22).reshape(3, 4)
b

출력:

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

함수 np.column_stack((a, b))는 2차원 배열 a, b를 수평으로(columns wise) 합친다.

np.column_stack((a, b))

출력:

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

2차원 배열에서 함수 np.column_stack((a, b))는 바로 np.hstack((a, b))와 같다.

np.hstack((a, b))

출력:

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

1차원 배열 a, b로 함수 numpy.column_stack((a, b))의 결과는 배열 ab를 먼저 축 1로 확장한 이후, 열로 쌓아 만든 2차원 배열을 반환한다.

x = np.array([1, 2, 3])
y = np.array([10, 20, 30])
np.column_stack((x, y))

출력:

array([[ 1, 10],
       [ 2, 20],
       [ 3, 30]])

위 1차원 배열의 np.column_stack((a, b))의 이해를 위해 다음 x의 1축을 증가시킨 2차원 배열을 생각해 보자. 1차원 배열에서 두 번째 축인 1축을 증가시키는 것은 다음 코드로 가능하다. 1차원 배열이 2차원으로 원소값이 (N, 1)인 열값으로 모양이 변형되었다.

x[:, np.newaxis]

출력:

array([[1],
       [2],
       [3]])

마찬가지로 1차원 배열 y의 1축을 증가시킨 2차원 배열은 다음과 같다.

y[:, np.newaxis]

출력:

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

다음 코드와 같이 1차원 배열 xy에서 함수 np.column_stack((x, y))np.column_stack((x[:, np.newaxis], y[:, np.newaxis]))와 같은 결과를 얻는다.

x = np.array([1, 2, 3])
y = np.array([10, 20, 30])
np.column_stack((x[:, np.newaxis], y[:, np.newaxis]))

출력:

array([[ 1, 10],
       [ 2, 20],
       [ 3, 30]])

하지만 np.hstack((x, y))의 결과는 함수 np.column_stack((x, y))의 결과와 전혀 다르다. 결국, 1차원에서의 np.hstacknp.column_stack은 그 결과가 다르다.

np.hstack((x, y))

출력:

array([ 1,  2,  3, 10, 20, 30])

np.column_stacknp.hstack의 결과는 항상 같은 것은 아니다. 그러므로 다음으로도 False가 반환된다.

np.column_stack == np.hstack

출력:

False

② numpy.row_stack()

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

import numpy as np

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

출력:

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

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

b = np.arange(10, 22).reshape(4, 3)
b

출력:

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

함수 np.row_stack((a, b))는 2차원 배열 a, b를 수직(vertically)으로 쌓는다.

np.row_stack((a, b))

출력:

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

함수 np.row_stack()np.vstack()과 그 기능이 같다.

np.vstack((a, b))

출력:

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

원소 수가 3개인 1차원 배열 ab의 함수 np.row_stack((a, b)) 결과는 다음과 같다.

a = np.array([4., 2., 1.])
b = np.array([3., 8., 7.])
print(np.row_stack((a, b)))

출력:

[[4. 2. 1.]
 [3. 8. 7.]]

함수 np.vstack((a, b)) 결과도 위와 같다.

print(np.vstack((a, b)))

출력:

[[4. 2. 1.]
 [3. 8. 7.]]

함수 np.row_stacknp.vstack의 결과는 항상 같다. 다음으로도 True가 반환된다.

np.row_stack == np.vstack

출력:

True
서브목차