배열의 차원 수정
배열의 차원을 수정하기 위해 reshape()
함수 또는 메서드 flatten(), ravel()
메서드, newaxis
의 속성을 사용할 수 있습니다.
- np.reshape(객체, shape), 객체.reshape(shape)
- 객체를 지정한 배열의 모양(shape)으로 변환
- 2차원 배열의 경우 인수 중 하나를 고정하고 다른 인수로 -1을 전달할 경우 자동으로 배분
import numpy as np
x=np.random.randint(20, size=(3,4)) x
array([[16, 5, 11, 6], [19, 19, 17, 14], [16, 16, 2, 4]])
print(x.reshape((2,6)))
[[ 6 3 8 8 13 5] [ 7 9 9 0 7 8]]
print(np.reshape(x, (-1, 6)))
[[16 5 11 6 19 19] [17 14 16 16 2 4]]
print(x.reshape((6,-1)))
[[16 5] [11 6] [19 19] [17 14] [16 16] [ 2 4]]
print(x.reshape((4,3)))
[[16 5 11] [ 6 19 19] [17 14 16] [16 2 4]]
다음 flatten()
과 ravel()
메서드는 다차원 배열을 1차원으로 전환합니다.
x.flatten()
array([ 6, 3, 8, 8, 13, 5, 7, 9, 9, 0, 7, 8])
x.ravel()
array([ 6, 3, 8, 8, 13, 5, 7, 9, 9, 0, 7, 8])
배열에 포함된 부분요소 또는 그 배열 자체의 차원을 증가시키기 위해서는 np.newaxis
속성을 적용합니다. 이 속성은 가장 근접한 차원에 새로운 축을 첨가합니다.
객체[part 또는 all, np.newaxis]
y=np.random.randint(10, size=(3)) y
array([8, 9, 3])#벡터
y[1]
9 #스칼라
y[1].ndim
0 #스칼라
위 코드의 1차원 배열인 y에서 y[1]과 같이 요소 하나를 슬라이싱하면 차원이 0인 스칼라가 됩니다. 그러나 다음 코드의 ①과 같이 시행하여 y의 부분은 y[1]의 차원을 증가시킬 수 있습니다. 실제로 스칼라 즉, 0차원이 1차원으로 증가된 것을 알 수 있습니다. ②은 y 자체를 1차원 증가시켜 2차원으로 변환한 것입니다.
y[1, np.newaxis] # ①
array([9])
y[1, np.newaxis].ndim
1
y[:, np.newaxis] # ②
array([[8], [9], [3]])#2차원 행렬
y[:, np.newaxis].ndim
2
다음은 2차원 배열인 x에 np.newaxis
를 적용한 것으로 위 객체 y에 적용한 것과 같은 방법이 사용됩니다.
np.random.seed(1) x=np.random.randint(10, size=(2,2)) x
array([[5, 8], [9, 5]])
numpy 배열의 슬라이싱의 기본 형식은 [1차원(행), 2차원(열),, …]입니다. 다음 코드 x[:]는 x[모든 행]을 의미하므로 [행, np.newaxis]은 행(리스트) 단위로 새로운 축이 첨가됩니다.
x[:]
array([[5, 8], [9, 5]])
[5, 8] → [[5,8]] 등
x[:, np.newaxis]
array([[[5, 8]], [[9, 5]]])>
객체[:, :]은 모든 행과 열을 나타내므로 x[:,:, np.newaxis]에서 새로운 축은 2차원(열)에 첨가됩니다.
x[:,:,np.newaxis]
array([[[5], [8]], [[9], [5]]])
1열에 축을 첨가합니다.
x[:, 1, np.newaxis]
array([[8], [5]])
1행에 축을 첨가합니다.
x[1,:, np.newaxis]
array([[9], [5]])
댓글
댓글 쓰기