NAN/Python

[NumPy_3] 배열의 차원 확장

onddd 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]]