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 이용 가능)
그리고 numpy의 배열 ndarray에 대해서 햇갈린다면, 아래의 글을 읽어보길 바란다.
2020/03/14 - [Python] - [ Python 3 ] Numpy 란 무엇인가? (ndarray 클래스)
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)