ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [NumPy_3] 배열의 차원 확장
    NAN/Python 2021. 6. 30. 20:38
    728x90

    배열의 차원 확장


     

    numpy 이를 통해 배열을 다루다 보면 종종 1차원 배열을 다차원으로 확장해야 하는 경우가 생기는데

     

    이때 사용할 수 있는 함수를 알아보자

     

    import numpy as np
    
    arr = np.array([1, 2, 3, 4, 5, 6])
    print(arr.shape)
    print(arr)
    
    (6,)
    [1 2 3 4 5 6]

     

    1부터 6까지의 요소를 갖는 array 이를 만들고 모양을 확인하니 (6, ) 형태가 출력되었는데,

     

    이를 다차원 배열로 바꾸기 위해서는 numpy.newaxis 라는 기능이 필요하다.

     

    newaxis는 지정된 위치에서 축을 하나 추가함으로써 차원을 확장하는 역할을 한다.

     

    arr2 = arr[np.newaxis, :]
    print(arr2.shape)
    print(arr2)
    
    (1, 6)
    [[1 2 3 4 5 6]]

     

     

    np.newaxis가 어디에 위치하느냐에 따라 확장되는 부분이 각각 달라지는데, 이 경우 첫 번째 축에 사용되어

     

    첫 번째 축에 새 차원이 확장되어 0차원은 1, 1차원은 6을 가지게 되었다.

     

    arr2 = arr[:,np.newaxis]
    print(arr2.shape)
    print(arr2)
    
    (6, 1)
    [[1]
     [2]
     [3]
     [4]
     [5]
     [6]]

     

     

    이번엔 array를 행에 위치시키고 열 위치제 newaxis를 넣으니, 0차원이 6 1차원은 1을 가지는 구조로 변환되었는데,

     

    여기에 축을 n번만큼 추가하게되면 추가 한 만큼 고차원 배열을 갖게 될 수 있다.

     


    직관적으로 이해하기

     

    import numpy as np
    
    arr = np.array([[[1],[2],[3]],[[4],[5],[6]]])
    print(arr.shape)
    print(arr)
    
    (2, 3, 1)
    [[[1]
      [2]
      [3]]
    
     [[4]
      [5]
      [6]]]

     

    다음과 같은 3차원 배열을 4차원으로 확장시키기 위해 newaxis를 사용해보자

     

    arr2 = arr[ : , np.newaxis, :, :]
    print(arr2.shape)
    print(arr2)
    
    (2, 1, 3, 1)
    [[[[1]
       [2]
       [3]]]
    
    
     [[[4]
       [5]
       [6]]]]

     

     

    어느 위치에 newaxis를 넣어도 새로운 축이 모두 추가되는 걸 확인할 수 있다.

     

    np.expand_dims() 함수역시 newaxis와 비슷한 개념이기 때문에 마찬가지로 배열 확장에 용이하니 참고하자

     

     

     

    np.expand_dims()

     

     

    기본 형태 : np.expand_dims(array, axis) 

     

    array : intup array

     

    axis : int 혹은 int tuple의 확장하고자 하는 축을 입력

     

    import numpy as np
    
    arr = np.array([1, 2])
    print(arr.shape)
    
    (2,)
    
    arr2 = np.expand_dims(arr, axis=0)
    print(arr2)
    print(arr2.shape)
    
    [[1 2]]
    (1, 2)
    arr2 = np.expand_dims(arr, axis = (0,1))
    print(arr2)
    
    [[[1 2]]]
    
    arr2 = np.expand_dims(arr,axis = (1,2))
    print(arr2)
    
    [[[1]]
    
     [[2]]]

     

    이처럼 사용하고, 여러 위치에 축을 추가 할 때는 tuple 타입으로 추가하고자 하는 위치에 넣어준다.

     

    reshape의 경우 구성하는 원소의 수가 변할 수 없어 정적이지만

     

    위 두가지 방법은 자유롭게 축을 설정할 수 있어 인덱싱에 유용하게 사용할 수 있고 계산에도 용이하다는

     

    강점이 있다.

     

     

     

    np.newaxis를 이용한 계산

    arr = np.arange(3)
    print(arr)
    
    [0 1 2]
    
    arr1 = arr[:, np.newaxis]
    print(arr1)
    
    [[0]
     [1]
     [2]]
     
    arr2 = arr[:, np.newaxis] * arr
    print(arr2)
    
    [[0 0 0]
     [0 1 2]
     [0 2 4]]
     
    arr3 = arr[:, np.newaxis] + arr
    print(arr3)
    
    [[0 1 2]
     [1 2 3]
     [2 3 4]]
     

     

     


     

Designed by Tistory.