[Python] 배열 조인(join) – Numpy Tutorial 5

넘파이 배열 조인

SQL에서의 조인은 키를 기반으로 하는 테이블들을 조인하는 것을 의미한다. 넘파이에서는 여러 배열들을 하나의 배열로 병합하는 과정을 조인(join)과정이라 한다. 조인을 하는 방식에는 여러가지 메소드들이 존재하는데 하나씩 알아보자.

Concatenate(잇기)

concatenate 함수는 두 개의 배열을 일렬로 잇는 메소드다.

import numpy as np

arr1 = np.array([1, 2, 3])

arr2 = np.array([4, 5, 6])

arr = np.concatenate((arr1, arr2))

print(arr)

위 코드를 실행하면 아래 결과처럼 두 개의 배열의 요소들이 하나의 배열로 이루어진 것을 볼 수 있다.

#결과
[1 2 3 4 5 6]

Axis(축)

조인에 사용되는 메소드에는 대개로 axis라는 인수가 존재하는데 axis에 따른 결과를 알아보자.

axis = 0배열을 진행방향이 행인 방향으로 동작한다.
axis = 1배열을 진행방향이 열인 방향으로 동작한다.
axis = 23차원 이상의 배열에서 사용할 수 있다. 이 경우, 배열을 진행방향이 깊이(d) 방향으로 동작한다.
하나씩 예제로 보자.

axis = 0

import numpy as np

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])

result = np.concatenate((arr1, arr2), axis=0)
print(result)

위 코드는 2차원 배열 두 개를 concatenate 하는 것이다. concatenate는 두 배열을 하나의 배열로 이어진다고 했는데 axis=0은 행 방향으로 합친다고 했다. 기본적인 2차원 배열의 구조는 행과 열로 볼 수 있는데, arr1의 배열을 예로 보자.

열1열2
행112
행234

위 테이블이 arr1의 형태이다. 우리는 조건에 따라 배열이 세로 방향으로 진행되므로 결과는 아래와 같다.

[[1 2]  #1행
 [3 4]  #2행
 [5 6]  #3행
 [7 8]] #4행

axis=1

axis=1은 가로 방향의 진행을 의미한다고 하였다.

import numpy as np

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])

result = np.concatenate((arr1, arr2), axis=1)
print(result)

위 코드를 실행하면 아래 결과가 출력된다.

[[1 2 5 6]
 [3 4 7 8]]

각 배열마다 가로로 이어졌다.

axis=2

axis=2 는 3차원 배열에서 사용할 수 있다.

import numpy as np

arr1 = np.array([[[1], [2]], [[3], [4]]])  # shape (2, 2, 1)
arr2 = np.array([[[5], [6]], [[7], [8]]])  # shape (2, 2, 1)

result = np.concatenate((arr1, arr2), axis=2)
print(result)

위 코드를 실행하면 깊이 병합이 이루어진다.

[[[1 5]
  [2 6]]

 [[3 7]
  [4 8]]]

Stack(스택)

스택 메소드는 concatenation와 비슷하지만, 스택은 새로운 축을 따라 수행된다는 점에서 차이가 있다. 두 개의 1차원 배열을 두 번째 축을 따라 연결하면, 배열이 서로 겹치게 놓이는 결과가 나온다. 이것을 스태킹이라 한다. stack() 메서드에 결합하고자 하는 배열의 시퀀스를 전달하고, 축(axis)을 지정한다. 축이 명시적으로 전달되지 않으면 기본적으로 0으로 설정된다.

import numpy as np

arr1 = np.array([1, 2, 3])

arr2 = np.array([4, 5, 6])

arr = np.stack((arr1, arr2), axis=1)

print(arr)

위 코드에서 axis=1로 설정하였다. 이는 행 방향으로 진행을 의미한다. 따라서 결과는 아래와 같이 [1,4],[2,5]..로 나타난다.

[[1 4]
 [2 5]
 [3 6]]

hstack(수평 스택), vstack(수직 스택)

hstack라는 메소드는 horizontal stack라는 의미로 수평적 스택을 의미하고 vstack 메소드는 vertical stack라는 의미로 수직적 스택을 의미한다. 예제를 보자.

import numpy as np

arr1 = np.array([1, 2, 3])

arr2 = np.array([4, 5, 6])

arr = np.hstack((arr1, arr2))

print(arr)

위 코드는 hstack의 예제인데 수평적 스택이므로 같은 인덱스의 배열을 합친다.

#결과
[1 2 3 4 5 6]

이 예제는 위에 concatenate에서도 봤다. 다른 예제를 보자. 만약 hstack 하려는 배열이 2차원 배열이라면? 예제를 보자.

import numpy as np

arr1 = np.array([[1, 2],[3, 4]])

arr2 = np.array([[4, 5], [6,7]])

arr = np.hstack((arr1, arr2))

print(arr)

위 코드를 활용해서 간단히 만들어봤다.

[[1 2 4 5]
 [3 4 6 7]]

위 결과를 보니 각 배열의 인덱스에 맞는 배열끼리 hstack 하는 것을 확인할 수 있었다.

이제 vstack의 예제를 보자.

import numpy as np

arr1 = np.array([1, 2, 3])

arr2 = np.array([4, 5, 6])

arr = np.vstack((arr1, arr2))

print(arr)

vstack는 수직적 스택이라고 말했는데, 말 그대로 배열 두 개를 수직으로 나열하는 것이다.

[[1 2 3]
 [4 5 6]]

vstack도 만약 배열이 2차원 배열이라면 어떨지 궁금해서 위 코드에서 hstack만 vstack으로 바꿔 보았다.

import numpy as np

arr1 = np.array([[1, 2],[3, 4]])

arr2 = np.array([[4, 5], [6,7]])

arr = np.vstack((arr1, arr2))

print(arr)

위 코드를 실행하니

[[1 2]
 [3 4]
 [4 5]
 [6 7]]

각 배열이 전부 수직으로 나열되었다. hstack과는 다르게 알던대로 수직으로 나열되는 것이 끝이었다.

dstack(깊이)

dstack()는 axis=2와 같은 의미를 가진다. 예제를 보자.

import numpy as np

arr1 = np.array([1, 2, 3])

arr2 = np.array([4, 5, 6])

arr = np.dstack((arr1, arr2))

print(arr)

위 코드를 실행하면 각 배열의 요소마다 새로운 배열이 되는 것을 볼 수 있다.

[[[1 4]
  [2 5]
  [3 6]]]

stack 메소드들은 axis를 인자로 넣지 않고 포함 되어있는 메소드들이 있어 사용하기 유용할 것 같다.

참고 – w3schools

최신글

댓글 남기기

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.