본문 바로가기
컴퓨터 언어/Python_NumPy

[ Numpy ] np.swapaxes, np.transpose (축을 기준으로 원소 배열은 어떻게 바뀌는가?)

by SuperMemi 2020. 3. 14.
반응형

numpy의 함수 swapaxes(array, axis, axis)는 array의 축을 바꾸는 것이다.

np.swapaxes는 직관적으로 축을 선정해 바꿀 수 있다.

 

그리고 구조를 바꾸는 np.reshape과 축을 바꾸는 np.swapaxes를 혼동하지 않길 바란다.

똑같은 shape을 가져도 그 안의 원소의 위치는 다를 수 있다.


이번 글을 읽기전에.

 

reshape을 잘 모르겠다면 아래의 글을 읽어보길 바란다.

2020/03/13 - [Python] - [ Python 3 ] Numpy reshape 함수란. (추가, 다른 형태의 자료를 np.array 활용하여 reshape 이용 가능)

 

[ Python 3 ] Numpy reshape 함수란. (추가, 다른 형태의 자료를 np.array 활용하여 reshape 이용 가능)

머신러닝이나 딥러닝을 하다보면 데이터의 구조를 바꿔서 처리할 때가 많은데 이때, numpy reshape을 많이 사용한다. reshape 함수는 numpy.ndarray의 차원과 모양을 바꿔준다. numpy.ndarray를 잘 모르겠다면 아..

supermemi.tistory.com

그리고 numpy의 배열 ndarray에 대해서 햇갈린다면, 아래의 글을 읽어보길 바란다.

2020/03/14 - [Python] - [ Python 3 ] Numpy 란 무엇인가? (ndarray 클래스)

 

[ Python 3 ] Numpy 란 무엇인가? (ndarray 클래스)

NumPy 소개 Numpy(보통 "넘파이"라고 발음)는 수치 해석용 Python 패키지이다. 다차원의 행렬 자료구조인 ndarray를 지원하여 벡터와 행렬을 사용하는 선형대수 계산에 주로 사용된다. C로 구현된 CPython에서만..

supermemi.tistory.com


Swapaxes(), transpose()

 

swapaxes는 선형대수에서 배운 transpose와 비슷한 개념을 가진다.

np.swapaxes() 와 비슷한 기능을 가진 numpy의 np.transpose()가 있다.

 

1. np.swapaxes(array, axis, axis) 2차원 행렬(matrix)적용.

2. np.swapaxes(array, axis, axis) 3차원 행렬(matrix)적용.

3. 비슷한 기능의 np.transpose 비교해보기.


예제 1. np.swapaxes(array, axis, axis) 2차원

          각 원소의 위치에 집중해서 봐라. 

          (1,2)에 위치한 원소가 축을 바꾼 후 (2,1)의 위치에 간것을 알 수 있다.

>>> a = np.arange(3).reshape(1,3)   # (1 X 3) 2D array
>>> a
array([[0, 1, 2]])
>>> y = np.swapaxes(a, 0, 1)        # 0은 가장 높은 차수의 축, 2차원
>>> y                               # 1은 그다음 높은 차수의 축, 1차원
array([[0],                         # 즉, 원소의 행과 열을 바꾸어라는것.
       [1],                         # (1,3) -> (3,1) 로 바뀌었다.
       [2]])
>>> y.shape
(3, 1)                              # (3 X 1) 2D array


>>> a = np.arange(6).reshape(2,3)   # (2 X 3) 2D array
>>> a
array([[0, 1, 2],
       [3, 4, 5]])
>>> y = np.swapaxes(a, 0, 1)        # 행과 열을 바꾸면.
>>> y.shape                         # (3 X 2 ) 2D array.
(3, 2)
>>> y
array([[0, 3],                      # 원소의 위치이동에 집중해서 보자.
       [1, 4],                      # 1은 (1,2)의 위치에 있었지만, 축을 바꾼 후 (2,1)의 위치에 있다.
       [2, 5]])                     # 5는 (2,3)의 위치에 있었지만, 축을 바꾼 후 (3,2)에 위치한 것을 알 수있다.
       

예제 2. np.swapaxes(array, axis, axis) 3차원

          차원이 커질 수록 더 햇갈린다. 원소의 위치변화에 집중해서 보길 바란다.

          일단 axis = 0 은 3차원 축,

                axis = 1 은 2차원 축,

                axis = 2 는 1차원 축 이다.

>>> a = np.arange(6).reshape(1,2,3)  # (1 x 2 x 3) 3D array이다.
>>> a
array([[[0, 1, 2],
        [3, 4, 5]]])
        
>>> y = np.swapaxes(a, 1, 2)      # 2차원 축과, 1차원 축을 바꿔라. 
>>> y                             # (1 x 2 x 3) -> (1 x 3 x 2) 3D array.
array([[[0, 3],                   # 1은 원래 (1,1,2)의 자리에서 (1,2,1)의 자리로 이동했다.
        [1, 4],                   # 2는 원래 (1,1,3)의 자리에서 (1,3,1)의 자리로 이동했다.
        [2, 5]]])                 #... 나머지 원소들도 위와 같은 규칙으로 전부 바뀌었다.
        
>>> y = np.swapaxes(a, 0, 1)      # 3차원 축과, 2차원 축을 바꿔라.
>>> y                             # (1 x 2 x 3) -> (2 x 1 x 3) 3D array.
array([[[0, 1, 2]],               # 3은 원래 (1,2,1)의 자리에서 (2,1,1)의 자리로 이동했다.
                                  # 5은 원래 (1,2,3)의 자리에서 (2,1,3)의 자리로 이동했다.
       [[3, 4, 5]]])
       
>>> y = np.swapaxes(a, 0, 2)      # 3차원 축과, 1차원 축을 바꿔라.
>>> y                             # (1 x 2 x 3) -> (3 x 2 x 1) 3D array.
array([[[0],                      # 2은 원래 (1,1,3)의 자리에서 (3,1,1)의 자리로 이동했다.
        [3]],                     # 5은 원래 (1,2,3)의 자리에서 (3,2,1)의 자리로 이동했다.

       [[1],
        [4]],

       [[2],
        [5]]])                    # 4차원도 똑같이 원소의 위치이동 개념으로 생각하면 쉬울 것이다.
        
        

예제 3. np.transpose()

transpose()는 사용자가 원하는대로 축을 한번에 여러개를 바꿀 수 있다.

2차원.

>>> a = np.arange(6).reshape(2,3) # (2 x 3) 2D array
>>> a
array([[0, 1, 2],
       [3, 4, 5]])
       
>>> y = np.swapaxes(a, 0, 1)       # np.swapaxes
>>> y
array([[0, 3],
       [1, 4],
       [2, 5]])
>>> y = np.transpose(a)            # np.transpose 동일한 결과를 보인다.
>>> y
array([[0, 3],
       [1, 4],
       [2, 5]])
       
>>> y = a.T                        # 추가로 T attribute도 이용할 수 있다.
>>> y
array([[0, 3],
       [1, 4],
       [2, 5]])

3차원.

np.transpose(a,(0,2,1)) 는 괄호 안의 숫자를 조정하여

사용자가 한번에 여러 축을 바꿔서 사용할 수 있는 기능이 있다.

위치가 햇갈리지 않도록 주의한다.

>>> a = np.arange(6).reshape(1,2,3)   # (1 x 2 x 3) 3D array이다.
>>> a
array([[[0, 1, 2],
        [3, 4, 5]]])
        
>>> y = np.transpose(a,(1,0,2))    # 3차원 자리에 2차원을
>>> y                              # 2차원 자리에 3차원을
array([[[0, 1, 2]],                # 1차원 자리에 1차원을 넣어서 바꾸라는 것.

       [[3, 4, 5]]])               # 5는 원래 (1,2,3)의 위치에서 (2,1,3)의 위치로 이동했다.
>>> y.shape                        # np.swapaxes(a, 0, 1)와 결과가 같다.
(2, 1, 3)                          # (1 x 2 x 3) -> (2 x 1 x 3) 3D array이다.



>>> y = np.transpose(a,(1,2,0))    # 3차원 자리에 2차원을
>>> y                              # 2차원 자리에 1차원을
array([[[0],                       # 1차원 자리에 3차원을 넣어서 바꾸라는 것.
        [1],
        [2]],                      # 5는 원래 (1,2,3)의 위치에서 (2,3,1)의 위치로 이동했다.

       [[3],
        [4],
        [5]]])
>>> y.shape                           # (1 x 2 x 3) -> (2 x 3 x 1) 3D array이다.
(2, 3, 1)

 

 

반응형