vstack & hstack & concatenate
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개로 만들어준 것이라고 생각하면 된다.