본문 바로가기
Python/NumPy

NumPy 배열 모양 변경

by 찐남 2021. 9. 10.
본 포스팅은 NumPy 패키지 홈페이지의 원문을 기반으로 하여 작성하였습니다.

 



배열의 모양 변경

 

배열은 각 축을 따라 요소의 수로 지정된 모양을 갖습니다. 

 

>>> rg = np.random.default_rng(1)
>>> a = np.floor(10 * rg.random((3, 4)))
>>> a
array([[3., 7., 3., 4.],
_______[1., 4., 2., 2.],
_______[7., 2., 4., 9.]])
>>> a.shape
(3, 4)

 

배열의 모양은 다양한 명령으로 변경할 수 있습니다. 다음 세 가지 명령은 모두 수정된 배열을 반환하지만 원래 배열은 변경하지 않습니다. 

 

>>> a.ravel()  # 평면화된 배열 반환
array([3., 7., 3., 4., 1., 4., 2., 2., 7., 2., 4., 9.])
>>> a.reshape(6, 2) # 수정된 모양의 배열 반환
array([[3., 7.],
_______[3., 4.],
_______[1., 4.],
_______[2., 2.],
_______[7., 2.],
_______[4., 9.]])
>>> a.T # 전치된 배열 반환
array([[3., 1., 7.],
_______[7., 4., 2.],
_______[3., 2., 4.],
_______[4., 2., 9.]])
>>> a.T.shape
(4, 3)
>>> a.shape
(3, 4)

 

ravel에서 생성된 배열의 요소 순서는 일반적으로 "C 스타일"입니다. 즉, 가장 오른쪽 인덱스가 "가장 빠르게 변경"되므로 a[0, 0] 뒤의 요소는 a[0, 1]입니다. 배열이 다른 모양으로 변형되면 배열은 다시 "C 스타일"로 처리됩니다. NumPy는 일반적으로 이 순서로 저장된 배열을 생성하므로 ravel은 일반적으로 인수를 복사할 필요가 없지만 배열이 다른 배열의 조각을 취하여 생성되었거나 비정상적인 옵션으로 생성된 경우 복사해야 할 수도 있습니다. ravel 및 reshape 함수는 선택적 인수를 사용하여 가장 왼쪽 인덱스가 가장 빠르게 변경되는 FORTRAN 스타일 배열을 사용하도록 지시할 수도 있습니다.

 

reshape 함수는 수정된 모양으로 인수를 반환하는 반면 ndarray.resize 메서드는 배열 자체를 수정합니다. 

 

>>> a
array([[3., 7., 3., 4.],
_______[1., 4., 2., 2.],
_______[7., 2., 4., 9.]])
>>> a.resize((2, 6))
>>> a
array([[3., 7., 3., 4., 1., 4.],
_______[2., 2., 7., 2., 4., 9.]])

 

크기 조정 작업에서 차원이 -1로 지정되면 다른 차원이 자동으로 계산됩니다. 

 

>>> a.reshape(3, -1)
array([[3., 7., 3., 4.],
_______[1., 4., 2., 2.],
_______[7., 2., 4., 9.]])

( ※ ndarray.shapereshaperesizeravel 등도 참고하세요.)

 



서로 다른 어레이를 함께 쌓기

 

여러 배열을 서로 다른 축을 따라 함께 쌓을 수 있습니다. 

 

>>> rg = np.random.default_rng(1) 
>>> a = np.floor(10 * rg.random((2, 2)))
>>> a
array([[9., 7.],
_______[5., 2.]])
>>> b = np.floor(10 * rg.random((2, 2)))
>>> b
array([[1., 9.],
_______[5., 1.]])
>>> np.vstack((a, b))
array([[9., 7.],
_______[5., 2.],
_______[1., 9.],
_______[5., 1.]])
>>> np.hstack((a, b))
array([[9., 7., 1., 9.],
_______[5., 2., 5., 1.]])

 

column_stack 함수는 1D 배열을 2D 배열에 열로 쌓습니다. 2D 배열의 경우에만 hstack과 동일합니다. 

 

>>> from numpy import newaxis
>>> np.column_stack((a, b)) # 2D 배열로
array([[9., 7., 1., 9.],
_______[5., 2., 5., 1.]])
>>> a = np.array([4., 2.])
>>> b = np.array([3., 8.])
>>> np.column_stack((a, b)) # 2D 배열 반환
array([[4., 3.],
_______[2., 8.]])
>>> np.hstack((a, b)) # 위의 결과와 다릅니다.
array([4., 2., 3., 8.])
>>> a[:, newaxis]      # `a`를 2D 열 벡터로 보기
array([[4.],
_______[2.]])
>>> np.column_stack((a[:, newaxis], b[:, newaxis]))
array([[4., 3.],
_______[2., 8.]])
>>> np.hstack((a[:, newaxis], b[:, newaxis])) # 결과는 동일합니다.
array([[4., 3.],
_______[2., 8.]])

 

반면에 row_stack 함수는 모든 입력 배열에 대한 vstack과 동일합니다. 실제로 row_stack은 vstack의 별칭입니다. 

 

>>> np.column_stack is np.hstack
False
>>> np.row_stack is np.vstack True

 

일반적으로 2차원 이상의 배열의 경우 hstack은 두 번째 축을 따라 스택 하고 vstack은 첫 번째 축을 따라 스택 하며 연결은 연결이 발생해야 하는 축의 번호를 제공하는 선택적 인수를 허용합니다. 

 

NOTE

 

복잡한 경우 r_ 및 c_는 한 축을 따라 숫자를 쌓아 배열을 만드는 데 유용합니다. 범위 리터럴을 사용할 수 있습니다.

 

>>> np.r_[1:4, 0, 4]
array([1, 2, 3, 0, 4])

 

배열을 인수로 사용하는 경우 r_ 및 c_는 기본 동작에서 vstack 및 hstack과 유사하지만 연결할 축의 번호를 제공하는 선택적 인수를 허용합니다. 

( ※ hstackvstackcolumn_stackconcatenatec_r_ 등도 참고하세요.)

 

하나의 배열을 여러 개의 작은 배열로 분할

 

hsplit을 사용하면 반환할 동일한 모양의 배열 수를 지정하거나 분할이 발생해야 하는 열을 지정하여 수평 축을 따라 배열을 분할할 수 있습니다. 

 

>>> rg = np.random.default_rng(1) 
>>> a = np.floor(10 * rg.random((2, 12)))
>>> a
array([[6., 7., 6., 9., 0., 5., 4., 0., 6., 8., 5., 2.],
_______[8., 5., 5., 7., 1., 8., 6., 7., 1., 8., 1., 0.]])
>>> # `a`를 3으로 나눕니다.
>>> np.hsplit(a, 3)
[array([[6., 7., 6., 9.],
_______[8., 5., 5., 7.]]),
array([[0., 5., 4., 0.],
_______[1., 8., 6., 7.]]),
array([[6., 8., 5., 2.],
_______[1., 8., 1., 0.]])]
>>> # 세 번째와 네 번째 열 뒤에 `a`를 나눕니다.
>>> np.hsplit(a, (3, 4))
[array([[6., 7., 6.],
_______[8., 5., 5.]]),
array([[9.],
_______[7.]]),
array([[0., 5., 4., 0., 6., 8., 5., 2.],
_______[1., 8., 6., 7., 1., 8., 1., 0.]])]

(※ vsplit은 세로 축을 따라 분할하고 array_split을 사용하면 분할할 축을 지정할 수 있습니다.)



반응형

'Python > NumPy' 카테고리의 다른 글

Numpy 고급 인덱싱 및 인덱스 트릭  (0) 2021.10.04
NumPy 복사 및 조회  (0) 2021.09.11
NumPy 인덱싱, 슬라이싱, 반복  (0) 2021.09.09
NumPy 기본 옵션 및 함수  (0) 2021.09.08
NumPy 활용 기초 코드 작성  (0) 2021.09.07

댓글