Python/Numpy

[Numpy] 배열 축 교환 함수 : np.transpose, np.swapaxes 사용법 정리

jimmy_AI 2022. 4. 10. 14:11
반응형

np.transpose, np.swapaxes 함수 사용 예제 비교

파이썬 넘파이 모듈에서 배열의 축을 바꿀 수 있는 함수들인

np.transpose와 np.swapaxes의 사용 방법을 이해하기 쉽게 다루어보도록 하겠습니다.

 

이 글을 numpy 패키지의 함수 설명 공식 document 글의 예시들을 기반으로 작성되었습니다.

 

 

transpose 함수 기본 사용법(2차원 배열 예시)

먼저, 가장 간단한 transpose 함수의 예제로 2차원 배열에서 전치 행렬을 반환받을 수 있는

방법들에 대해서 살펴보겠습니다.

 

array x에 대하여 np.transpose(x), x.transpose(), x.T의 3가지 형태로

x의 두 축이 교환된 전치 행렬을 반환받을 수 있습니다.

import numpy as np

x = np.array([[1, 2, 3],
              [4, 5, 6]])

# 아래 3가지 모두 같은 결과 반환
np.transpose(x)
x.transpose()
x.T

# 출력 결과
array([[1, 4],
       [2, 5],
       [3, 6]])

 

 

transpose 함수 축 지정 사용법(3차원 배열 예시)

np.transpose 함수의 복잡한 활용 경우로, 3차원 배열에서

각 축이 재배열될 위치를 선정하여 축끼리의 교환을 만드는 예제를 살펴보겠습니다.

 

이 경우에는 transpose(배열, 축 순서 튜플) 형태로 input 2가지를 지정해주시면 됩니다.

 

예를 들어, 다음와 같은 3차원 배열 y에 대하여 1번2번 axis 간의 교환을 진행하려면

아래의 코드처럼 (0, 2, 1) 형태로 축 순서 튜플을 지정해주시면 됩니다.

y = np.array([[[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]],
             
             [[-1, -2, -3],
             [-4, -5, -6],
             [-7, -8, -9]]])

np.transpose(y, (0, 2, 1))
'''
array([[[ 1,  4,  7],
        [ 2,  5,  8],
        [ 3,  6,  9]],

       [[-1, -4, -7],
        [-2, -5, -8],
        [-3, -6, -9]]])'''

내부의 3x3 배열 2개가 각각 전치된 결과가 반환되었음을 볼 수 있었습니다.

반응형

추가 예시로, 같은 배열 y에 대하여 0번과 1번 axis를 바꾼 결과인 (1, 0, 2) 방향 전치 결과와

3축의 순서를 뒤죽박죽 섞은 (1, 2, 0) 방향 transpose 결과는 아래와 같았습니다.

np.transpose(y, (1, 0, 2))
'''array([[[ 1,  2,  3],
        [-1, -2, -3]],

       [[ 4,  5,  6],
        [-4, -5, -6]],

       [[ 7,  8,  9],
        [-7, -8, -9]]])'''

np.transpose(y, (1, 2, 0))
'''array([[[ 1, -1],
        [ 2, -2],
        [ 3, -3]],

       [[ 4, -4],
        [ 5, -5],
        [ 6, -6]],

       [[ 7, -7],
        [ 8, -8],
        [ 9, -9]]])'''

위 예제들의 원리를 간단하게 이해해보기 위하여

배열 y에 대해서 axis 0 방향은 초록색, axis 1 방향은 빨간색, axis 2 방향은 파란색으로

표시하고, 각 축 방향의 대표 원소들을 네모, 동그라미, 세모 모양으로 지정하여

transpose 결과의 변경된 축 방향을 추적한 예시는 아래 그림과 같으니 참고해보세요.

추가로, 만일 3차원 이상의 배열에 대하여 transpose의 축 순서 튜플을 지정하지 않은 경우,

default로 (2, 1, 0), (3, 2, 1, 0)처럼 전체 axis 방향이 reverse된 결과

축 순서 튜플로 간주되어 축 교환이 수행됩니다.

 

다차원 배열들에서 축 교환이 진행된 결과의 shape을 비교해본 결과는 아래와 같습니다.

a = np.ones((2, 3, 4))
np.transpose(a).shape # (4, 3, 2) -> (2, 1, 0) 방향 transpose와 동일
np.transpose(a, (2, 0, 1)).shape # (4, 2, 3)

b = np.ones((2, 3, 4, 5, 6))
np.transpose(b).shape # (6, 5, 4, 3, 2) -> (4, 3, 2, 1, 0) 방향 transpose와 동일
np.transpose(b, (4, 1, 0, 3, 2)).shape # (6, 3, 2, 5, 4)

 

 

swapaxes 함수 사용법

마지막으로, 변경할 두 축의 위치를 직접 지정하여 축 교환을 진행할 수 있는

np.swapaxes 함수의 사용 예제를 살펴보겠습니다.

 

이 함수는 np.swapaxes(배열, 축1, 축2) 형태로 사용하시거나, 혹은

배열.swapaxes(축1, 축2) 형태로도 사용이 가능합니다.

 

예시로 3차원 배열에서 0번과 1번 축을 바꾼 결과는 transpose 함수에서

축 순서 튜플을 (1, 0, 2)로 지정하여 반환된 결과와 동일하게 됩니다.

 

transpose의 예제에서 사용했던 3차원 배열 y에 대하여

swapaxes를 적용한 예시 코드는 아래와 같습니다.

np.swapaxes(y, 0, 1) # np.transpose(y, (1, 0, 2)) 동일 결과
# y.swapaxes(0, 1)처럼도 가능
'''array([[[ 1,  2,  3],
        [-1, -2, -3]],

       [[ 4,  5,  6],
        [-4, -5, -6]],

       [[ 7,  8,  9],
        [-7, -8, -9]]])'''

np.swapaxes(y, 1, 2) # np.transpose(y, (0, 2, 1)) 동일 결과
# y.swapaxes(1, 2)처럼도 가능
'''array([[[ 1,  4,  7],
        [ 2,  5,  8],
        [ 3,  6,  9]],

       [[-1, -4, -7],
        [-2, -5, -8],
        [-3, -6, -9]]])'''