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]]])'''
'Python > Numpy' 카테고리의 다른 글
[Numpy] 파이썬 행렬 대각합, 행렬식 함수 : np.trace, LA.det (6) | 2022.04.13 |
---|---|
[Numpy] np.append 사용법 : 배열끼리 이어 붙인 결과 반환 (0) | 2022.04.06 |
[Numpy] np.unique 사용법 정리 : 고유한 값들만 모아서 반환 (2) | 2022.03.24 |