5-2 . Numpy 제공 자료구조/Array 연산

[파이썬 numpy] 배열의 전치를 원하는 방향으로 (transpose 메소드)

만다린망고 2020. 11. 11. 16:45
반응형

[파이썬 numpy] 

배열의 전치를 원하는 방향으로 (transpose 메소드)



transpose 메소드는 T메소드보다 확장된 방법이다. T메소드는 배열의 shape을 역방향으로 바꾸는 것만 할 수 있지만 transpose 메소드는 원하는 방향으로 바꿀 수가 있다. 


방향이 정방향과 역방향 둘 뿐인 2차원 배열에서는 T메소드와 transpose 메소드의 결과가 같다. 하지만 3차원 이상에서는 달라질 수 있다. 




2차원 배열


shape이 (2,3)인 배열을 하나 정의하자. 2행 3열로 해석할 수도 있다. 


>>> A=np.arange(6).reshape(2,3)

>>> A

array([[0, 1, 2],

       [3, 4, 5]])


T메소드를 적용해보자.


>>> A.T

array([[0, 3],

       [1, 4],

       [2, 5]])


shape 이 (2,3)에서 (3,2)로 바뀐다. 


이번에는 transpose 메소드를 적용해보자. 변수에 메소드를 직접 적용해도 되고, 메소드에 변수를 적용해도 된다. 


>>> A.transpose()

array([[0, 3],

       [1, 4],

       [2, 5]])


또는


>>> np.transpose(A)

array([[0, 3],

       [1, 4],

       [2, 5]])


T메소드와 결과가 동일하다는 것을 알 수 있다. 




3차원배열


shape이 (2,3,4)인 배열을 하나 정의하자. 3행4열이 두 층 쌓여있는 것으로 이해할 수 있다.


>>> A=np.arange(24).reshape(2,3,4)

>>> A

array([[[ 0,  1,  2,  3],

        [ 4,  5,  6,  7],

        [ 8,  9, 10, 11]],


       [[12, 13, 14, 15],

        [16, 17, 18, 19],

        [20, 21, 22, 23]]])


T메소드를 적용해보자.


>>> A.T

array([[[ 0, 12],

        [ 4, 16],

        [ 8, 20]],


       [[ 1, 13],

        [ 5, 17],

        [ 9, 21]],


       [[ 2, 14],

        [ 6, 18],

        [10, 22]],


       [[ 3, 15],

        [ 7, 19],

        [11, 23]]])


>>> A.T.shape

Out[558]: (4, 3, 2)


배열 모양이 (2,3,4)에서 (4,3,2)로 바뀐 것을 알 수 있다. 



transpose 메소드를 적용해보자. 


>>> A.transpose((2,1,0))

array([[[ 0, 12],

        [ 4, 16],

        [ 8, 20]],


       [[ 1, 13],

        [ 5, 17],

        [ 9, 21]],


       [[ 2, 14],

        [ 6, 18],

        [10, 22]],


       [[ 3, 15],

        [ 7, 19],

        [11, 23]]])


괄호 안에는 입력한 것은 axis번호다. 기존 shape인 (2,3,4)는 각각 axis0,1,2 에 매칭되어 있었다. 기존 axis는 아래와 같다.


axis0=2

axis1=3

axis2=4


새로 입력한 (2,1,0)은 순서를 아래와 같이 바꾼다는 것을 의미한다. axis 뒤에 붙은 숫자를 잘 보면 이해가 될거다. 


axis2=4

axis1=3

axis0=2


따라서 shape이 (4,3,2)로 바뀐것이다. 


>>> A.transpose((2,1,0)).shape

(4, 3, 2)


이번에는 A를 axis (1,2,0)으로 transpose해보자. 결과가 어떻게 될까? 


axis1=3

axis2=4

axis0=2


위와 같이 바뀔테니, shape이 (3,4,2)가 될 것이다. 


>>> A.transpose((1,2,0))

array([[[ 0, 12],

        [ 1, 13],

        [ 2, 14],

        [ 3, 15]],


       [[ 4, 16],

        [ 5, 17],

        [ 6, 18],

        [ 7, 19]],


       [[ 8, 20],

        [ 9, 21],

        [10, 22],

        [11, 23]]])


>>> A.transpose((1,2,0)).shape

Out[562]: (3, 4, 2)



반응형