영상처리/OpenCV

배열 차원 변형

성혜영 2022. 6. 7. 13:58

N차원으로 초기화된 배열의 데이터를 변경하지 않고 새로운 차원의 배열 생성

새로운 형태의 배열은 원본 배열의 모양과 호환돼야 함.

->  원래 데이터의 총 길이의 곱(개수)과 동일해야 함

 

import numpy as np



array = np.arange(12)



reshape1 = array.reshape(2,3,2)

reshape2 = np.reshape(array, (2, -1), order='F')



print(reshape1)

print(reshape2)

<배열의 차원 변형>

[[[ 0  1]

  [ 2  3]

  [ 4  5]]



 [[ 6  7]

  [ 8  9]

  [10 11]]]

[[ 0  2  4  6  8 10]

 [ 1  3  5  7  9 11]]

 

배열의 차원 형태 변형

  • array.reshape(n, m, k, …, order=’C’
  • np.reshape(array, (n, m, k, …), order=’C’)
  • order : 배열의 메모리 레이아웃

 

(첫번째 결과) 1차원 array 배열을 2페이지 3행 2열 형태로 차원을 변형해 출력

(두번째 결과) 2행 6열의 형태로 변형, 배열의 메모리 레이아웃을 Fortran 스타일로 출력

 

배열의 차원을 결정하는 n,m,k… 매개 변수 중 -1 요소는 나머지 매개 변수 값을 배열의 차원을 계산해 원본 배열의 모양과 호환되는 값이 할당됨.

원본 배열의 크기가 미리 정해져 있기 때문에 -1 자리에 위치한 차원은 reshape() 함수가 계산

즉, 원본 배열의 크기가 3x4일 때 인수의 값을 (2, 6)으로 지정하는 것과 (2, -1)로 지정하는 것은 동일한 의미. (미지수가 하나이기 때문에 -1 자리에는 무조건 6의 값이 할당됨)

 

reshape() : 전체 요소에 대해 값을 재정렬하고 차원을 변형 (확장/축소)

단순히 차원만 증가시키는 경우 newaxis를 활용해 차원 확장 가능

 

import numpy as np



array = np.arange(4)



axis1 = array[np.newaxis]

axis2 = array[:, np.newaxis]



print(axis1)

print(axis2)

<배열의 차원 확장>

[[0 1 2 3]]

[[0]

 [1]

 [2]

 [3]]

 

대괄호 안에 np.newaxis를 지정해 배열의 차원을 증가시킴

행 부분에 지정할 경우 차원을 한단계 추가

열 부분에 지정할 경우 요소를 분해한 뒤 차원을 한 단계 추가



반대로 차원을 축소하려면 reshape() 외에도 1차원 배열로 변형 가능

 

import numpy as np



array = np.arange(12).reshape(3,-1)



flat1 = array.flatten(order='F')

flat2 = array.ravel()



print(flat1)

print(flat2)

<배열의 차원 축소>

[ 0  4  8  1  5  9  2  6 10  3  7 11]

[ 0  1  2  3  4  5  6  7  8  9 10 11]

 

array는 3x4 형태의 2차원 배열임. 다중 차원 형태의 배열을 1차원 형태의 배열로 변형

flatten()과 ravel()은 동일한 결과를 반환, 두 함수 모두 매개 변수로는 order를 사용

 

추가로 1차원 형태로 변형하는 ravel()은 np.ravel() 형식으로도 사용 가능

하지만 flatten() 함수의 경우 numpy.ndarray 클래스에 포함되어 있어

np.flatten()이 아닌 np.ndarray.flatten() 형식으로 사용

 

'영상처리 > OpenCV' 카테고리의 다른 글

배열 연산  (0) 2022.06.07
배열 병합 및 분리  (0) 2022.06.07
배열의 블록 단위 요소에 접근  (0) 2022.06.07
배열의 개별 단위 요소에 접근 방법  (0) 2022.06.07
ndarray 클래스 - N차원 배열  (0) 2022.06.07