Python/Numpy

[Numpy] 배열을 반복하여 쌓는 함수 np.tile 사용법(그림으로 정리)

jimmy_AI 2022. 1. 13. 11:42
반응형

파이썬 넘파이 배열 쌓기 함수 : np.tile

이번 글에서는 넘파이 라이브러리에서 배열을 원하는 모양으로

쌓아 올릴 수 있는 함수인 np.tile 함수의 사용법에 대해서

알아보는 시간을 가져보겠습니다.

 

이 글은 np.tile 함수의 넘파이 공식 document의 내용을 기반으로 작성되었습니다.

 

np.tile 함수의 사용법은 매우 간단합니다.

np.tile(A, repeat_shape)

형태이며, A 배열이 repeat_shape 형태로 반복되어 쌓인 형태가 반환됩니다.

 

1차원과 2차원 배열을 np.tile 함수를 이용하여 반복 쌓기한 형태를 보며,

함수의 사용법을 이해해보도록 하겠습니다.

 

np.tile 1차원 배열 쌓기 예제

[5, 6] 형태의 2개의 원소를 가진 배열을 선언하고,

가로로만 3차원, 그리고 (2, 2) 차원으로 쌓기를 해보겠습니다.

import numpy as np

a = np.array([5, 6])

np.tile(a, 3)
# array([5, 6, 5, 6, 5, 6]), shape = (6,)

np.tile(a, (2, 2))
'''array([[5, 6, 5, 6],
       [5, 6, 5, 6]]) shape = (2, 4)'''

[5, 6]이 가로로 3번, 그리고 2 * 2 배열 모양으로 반복하여

쌓아진 형태임을 알 수 있습니다.

 

그림으로 이해하면 다음과 같습니다.

[5, 6] 형태가 input으로 넣은 shape만큼 반복되고 있습니다.

 

이번에는 더 다양한 모양으로도 쌓아보도록 하겠습니다.

np.tile(a, (2, 1))
'''array([[5, 6],
       [5, 6]]), shape = (2, 2)'''

np.tile(a, (1, 2))
# array([[5, 6, 5, 6]]), shape = (1, 4)

np.tile(a, (2, 2, 3))
'''array([[[5, 6, 5, 6, 5, 6],
        [5, 6, 5, 6, 5, 6]],

       [[5, 6, 5, 6, 5, 6],
        [5, 6, 5, 6, 5, 6]]]), shape = (2, 2, 6)'''

a가 2개 원소를 가진 배열이었으므로,

반복 shape이 (a, b, ..., z) 식이라면, 최종 shape는 (a, b, ... ,z * 2)로

마지막 axis 자리만 2배가 되는 것을 확인해보실 수 있습니다.

 

그림을 통해서 (2, 1)와 (1, 2) shape로 쌓은 결과의 차이를 이해해볼 수 있습니다.

역시 [5, 6] 배열이 반복되는 형태에 주목해주시면 됩니다.

반응형

np.tile 2차원 배열 쌓기 예제

이번에는 조금 더 복잡한 경우로 2차원 배열을 쌓아보겠습니다.

 

배열 선언 뒤, 가로로만 2개가 쌓아진 형태로 쌓은 예시입니다.

b = np.array([[1, 3], 
              [5, 7]])

np.tile(b, 2)
'''array([[1, 3, 1, 3],
       [5, 7, 5, 7]])'''

첫 행이 (1, 3, 5, 7)이 아니라 (1, 3, 1, 3) 형태로 나타나고 있습니다.

이는 아래 그림에서 배열이 쌓여지는 원리를 보시면 이해가 쉽습니다.

1, 3, 5, 7이 있는 기존 배열의 형태가 유지되며 input shape대로 쌓아올리게 됩니다.

 

더 복잡한 shape으로도 쌓은 경우도 아래처럼 되는 것을 이해할 수 있습니다.

np.tile(b, (2, 2))
"""array([[1, 3, 1, 3],
       [5, 7, 5, 7],
       [1, 3, 1, 3],
       [5, 7, 5, 7]]), shape = (4, 4)"""

np.tile(b, (2, 2, 3))
"""array([[[1, 3, 1, 3, 1, 3],
        [5, 7, 5, 7, 5, 7],
        [1, 3, 1, 3, 1, 3],
        [5, 7, 5, 7, 5, 7]],

       [[1, 3, 1, 3, 1, 3],
        [5, 7, 5, 7, 5, 7],
        [1, 3, 1, 3, 1, 3],
        [5, 7, 5, 7, 5, 7]]]), shape = (2, 4, 6)"""

여기서는 최종 shape이 input으로 넣은 shape을 기준으로

마지막 axis 두 자리가 2배가 되는 것을 확인할 수 있었습니다.