[NumPy_3] 배열의 차원 확장
배열의 차원 확장
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]]