numpy

vstack & hstack & concatenate

siwoli 2022. 3. 26. 12:14

vstack(()): 수직으로 배열 붙임(vertical)

hstack(()): 수평으로 배열 붙임(horizontal)


기본적으로 numpy는 열벡터를 표현할수 없기 때문에
1차원 행 배열로 표현된 벡터를 열배열 형태로 hstack할때는 reshape해줘야한다.

 

다음과 같이 벡터를 생성하고 vstack하면

a1 = np.array([1,2,3])
a2 = np.array([4,5,6])
np.vstack((a1,a2))

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

          [4, 5, 6]])

이렇게 수직으로 배열이 합쳐진다.

그리고 hstack을 하면 두 배열이 각각 수평으로 나열되는 것이 아니라 완전히 하나의 배열로 합쳐진다.

np.hstack((a1, a2))

>array([1, 2, 3, 4, 5, 6])

 

a1, a2배열을 열 벡터 형태인 b1, b2로 변환 후 실행해보자.

b1 = a1.reshape(-1,1)
b2 = a2.reshape(-1,1)
b1

>array([[1],

          [2],

          [3]])

shape = (1, 3)에서 (3, 1)로 바꼈다.

 

이제 hstack을 하면

np.hstack((b1, b2))

>array([[1, 4],

          [2, 5],

          [3, 6]])

이렇게 수평 방향으로 배열이 합쳐진다.

 

그리고 vstack을 하면

np.vstack((b1, b2))

>array([[1],

          [2],

          [3],

          [4],

          [5],

          [6]])

이렇게 수직 방향으로 배열이 합쳐진다.

 

concatenate((배열1,배열2), axis=)

축을 기준으로 배열을 붙이는데 생성될 배열과 기존 배열의 차원이 같아야한다.
만약 두 벡터를 붙여 하나의 행렬로 만드려면 벡터를 2차원 형태(행렬)로 변환후 concatenate해야한다.

 

다음과 같이 a1과 a2를 axis=1(열끼리)로 concatenate해보자.

np.concatenate((a1, a2), axis=1)

>AxisError: axis 1 is out of bounds for array of dimension 1

a1, a2의 차원은 1차원이지만 concatenate될 배열의 차원은 2차원이므로

1차원에서는 axis 1이 범위를 벗어나기 때문에 AxisError가 난다.

그러므로 a1, a2를 2차원 형태 (1, 3)으로 변환 후 concatenate하면

a11 = a1.reshape(-1,3)
a22 = a2.reshape(-1,3)
np.concatenate((a11,a22),axis=1)

>array([[1, 2, 3, 4, 5, 6]])

이렇게 수평방향으로 합쳐진 2차원 배열이 생성된다.

 

vstack, hstack, concatenate 3개 모두 배열을 함수의 인자로 줄때 괄호를 한번 더 씌었는데, 

이는 TypeError: _vhstack_dispatcher() takes 1 positional argument but 2 were given가 뜨기 때문이다.

즉, 배열들을 합쳐서 1개의 인자만 받아야하므로 괄호를 씌어 2개의 배열을 1개로 만들어준 것이라고 생각하면 된다.