본문 바로가기
Python/NumPy

배열(array)의 형상(shape) 정보 확인과 조작(reshape, resize) - NumPy(14)

by 콩돌 2019. 3. 7.
반응형

참고 자료

https://docs.scipy.org/doc/numpy/user/quickstart.html



파이썬 버전 3.7 기준

NumPy 버전 1.16 기준


본 포스팅에서 다루는 범위는 다음과 같다.

형상정보 확인을 위한 기능(dim, shape, size, itemsize, dtype, data)와 형상조작을 위한 기능(ravel, transpose, reshape, resize)를 다룬다.



배열(array)의 형상(shape) 정보 확인과 조작 


형상 확인 메서드


Numpy 배열의 기초 지식

  ○ 넘파이의 메인 오브젝트는 균일하고 다차원의 배열이다.

  ○ 요소로 이루어진 테이블이라고 볼 수 있으며, 모두 같은 타입이다.

  ○ 양의 정수의 튜플로 인덱싱될 수 있다.

  ○ 넘파이에서 차원은 axes(축)이라 불린다.

    ▷ 예를들어 [1,2,3]과 같은 리스트는 1개의 축(차원)을 가진다.

    ▷ [[1,2,3],[4,5,6]]과 같은 리스트는 2개의 축(차원)을 가진다.

※ 이런 특징들은 구조체배열에서는 적용되지 않을 수도 있다.


  ○ 넘파이의 배열 클래스는 ndarray라고 명칭되어 있다.

    ▷ 흔히 array(배열)이라고 부른다.

    ▷ 넘파이에서의 ndarray는 파이썬 라이브러리인 array.array와는 다름에 유의하자.

    ▷ 넘파이의 형상 정보와 관련된 메서드는 다음과 같이 정리해 놓았다.


ndarray.ndim

  ○ 배열의 차원(dimension) 혹은 축(axis)의 숫자를 출력한다.


ndarray.shape

  ○ 배열의 형상 정보(차원 혹은 축)를 출력한다. 

    ▷ 각 축의 요소 개수를 튜플의 형태로 출력한다.
    ▷ 출력하는 튜플의 요소 수는 ndim 메서드의 출력과 동일하다.
    ▷ 2차원 형태로 예를들면, n개의 행과, m개의 열로 구성되어있을 경우 shape 메서드는 (n,m)을 출력한다. 

ndarray.size

  ○ 배열의 요소 수를 출력한다. 

    ▷ shape 메서드 결과의 총 합과 결과가 같다.


ndarray.dtype

  ○ 배열 요소의 자료형을 출력한다.

  ○ 파이썬 내장 자료형 뿐만이 아니라 넘파이 자체 자료형 역시 제공한다.

    ▷ numpy.int32, numpy.int16, numpy.float64등 다양한 예가 있다.

ndarray.itemsize

  ○ 각 배열 요소의 바이트의 크기를 출력한다. 

    ▷ 예를들면 float64면 8비트가 1바이트이므로 64/8인 8을 출력한다. 

  ○ ndarray.dtype.itemsize와 같다.

ndarray.data

  ○ 배열의 요소를 담고있는 버퍼를 출력한다.

  ○ 보통 요소를 접근할때에는 인덱싱을 사용하게 되므로, 굳이 이 어트리뷰트를 사용할 필요는 없다.


사용 예)
# 예제를 위한 입력
In[2]: import numpy as np
In[3]: x = np.arange(10).reshape(2,5)
In[4]: x
Out[4]: 
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

# 형상 정보 확인
In[5]: x.shape
Out[5]: (2, 5)
In[6]: x.ndim
Out[6]: 2
In[7]: x.dtype
Out[7]: dtype('int32')
In[8]: x.itemsize
Out[8]: 4
In[9]: x.size
Out[9]: 10


형상 조작 메서드

  ○ 배열은 각 축에 따라 요소 수에 의해 결정되는 형상을 지고 있다. 

  ○ 그리고 배열의 형상은 다양한 커맨드에 의해 변경될 수 있다.
    ▷ 배열의 형상은 조작되어 반환되지만, 대부분의 함수 혹은 메서드는 원본 형상을 유지시키는 경우가 대부분이다. 
  ○ 다음은 형상조작을 위한 기능들을 소개하며, 소개되는 기능들은 메서드와 함수 존재하므로 사용자 취향에 따라 사용하면 된다.
    ▷ 하지만 일부 함수 및 메서드는 거동에 약간의 차이가 있을 수 있으므로 주의한다.

numpy.ravel(a, order='C''), ndarray.ravel(order='C'')

  ○ 입력된 배열의 요소를 1차원 상에 연속적으로 나열하여 반환한다.

  ○ 각 입력요소에 대한 설명은 아래와 같다.

    ▷ a: 새로운 형태로 변경하기 위해 입력받는 배열을 의미한다.

    ▷ order 

      - 선택적으로 입력이 가능하며, 입력 가능한 옵션으로는 'C', 'F', 'A', 'K'가 있다.

      - 'C'는 C언어 스타일로 요소를 인덱싱 하게 만든다. 마지막 축이 가장 빠르게 변경되며, 첫번째 축이 가장 늦게 변경된다. 

      - 'F'는 Fortran언어 스타일로 요소를 인덱싱하게 만든다. 첫번째 축이 가장 빠르게 변경되며, 마지막 축이 가장 늦게 변경된다.

      - 'A'는 입력된 배열 a의 메모리가 Fortran언어나 C언어 둘중 어느쪽에 근접한지 분석한 후 이에 따라 결정되게 설정한다.

      - 'K'는 메모리에서 발생하는 순서대로 요소를 읽는 것을 의미한다.(스트라이드가 음수일 때 데이터가 반전되는 상황은 제외한다.)

      - 'C'와 'F' 옵션에서는 요소의 인덱싱만 관련되지 메모리 레이아웃에는 영향이 없다.

  ○ ndarray.flatten 메서드도 거의 동일한 기능을 수행한다.

사용 예)
# 예제용 입력
In[12]: x = np.arange(15).reshape(3,5)
In[13]: x
Out[13]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

# 함수 및 메서드 사용 결과
In[14]: np.ravel(x)
Out[14]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
In[15]: x.ravel()
Out[15]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

numpy.transpose(a, axes=None), ndarray.transpose(*axes), ndarray.T(*axes)

  ○ 배열을 전치시킨다. 

  ○ 각 입력요소에 대한 설명은 아래와 같다.

    ▷ a: 새로운 형태로 변경하기 위해 입력받는 배열을 의미한다.

    ▷ axis: 선택적으로 입력이 가능하다. 기본적으로 차원을 반대로 전치시키나, 그렇지 않을 경우 주어진 값에 따라 축을 치환시킨다.


사용 예)

# 예제용 변수(위의 예제에서 입력한 변수 사용)

In[17]: x

Out[17]: 

array([[ 0,  1,  2,  3,  4],

       [ 5,  6,  7,  8,  9],

       [10, 11, 12, 13, 14]])


# 함수 및 메서드 사용 결과

In[18]: np.transpose(x)

Out[18]: 

array([[ 0,  5, 10],

       [ 1,  6, 11],

       [ 2,  7, 12],

       [ 3,  8, 13],

       [ 4,  9, 14]])

In[19]: x.T

Out[19]: 

array([[ 0,  5, 10],

       [ 1,  6, 11],

       [ 2,  7, 12],

       [ 3,  8, 13],

       [ 4,  9, 14]])


numpy.reshape(a, newshape, order='C')ndarray.reshape(newshape, order='C')

  ○ 배열의 요소를 바꾸지 않고, 배열의 형상을 변경시킨다.

  ○ 각 입력요소에 대한 설명은 아래와 같다.

    ▷ a: 새로운 형태로 변경하기 위해 입력받는 배열을 의미한다.

    ▷ newshape: 새롭게 변경시킬 형상의 정보를 입력하며, 튜플을 입력받는다. 1개의 정수를 입력받을시 정수에 해당되는 1차원 배열을 출력한다.

    ▷ order: ravel의 order과 'K'옵션이 없다는것을 제외하면 거의 동일하다.


사용 예)

# 예제용 변수(위의 예제에서 입력한 변수 사용)

In[20]: x

Out[20]: 

array([[ 0,  1,  2,  3,  4],

       [ 5,  6,  7,  8,  9],

       [10, 11, 12, 13, 14]])


# 함수와 메서드 사용 결과

In[21]: np.reshape(x,(5,3))

Out[21]: 

array([[ 0,  1,  2],

       [ 3,  4,  5],

       [ 6,  7,  8],

       [ 9, 10, 11],

       [12, 13, 14]])

In[22]: x.reshape((5,3))

Out[22]: 

array([[ 0,  1,  2],

       [ 3,  4,  5],

       [ 6,  7,  8],

       [ 9, 10, 11],

       [12, 13, 14]])


numpy.resize(a, new_shape)ndarray.resize(new_shape, refcheck=True)

  ○ 입력된 형상으로 새로운 배열을 만들어 반환한다.

  ○ 함수로 사용할때와 메서드로 사용할때 거동이 다른 부분이 있다.

    ▷메서드로 사용할 시: reshape과는 다르게 원본 형상을 변경시킨다. 

    ▷함수로 사용할 시: 만약 변경하기 위해 입력된 형상의 크기가 원본 배열보다 크기가 크다면, 자동으로 입력된 배열 a를 반복시켜 배열을 채운다.

  ○ 각 입력요소에 대한 설명은 아래와 같다.

    ▷ a: 새로운 형태로 변경하기 위해 입력받는 배열을 의미한다.

    ▷ new_shape: 새롭게 변경시킬 형상의 정보를 입력하며, 튜플을 입력받는다.


사용 예)
# 예제용 변수(위의 예제에서 입력한 변수 사용)
In[23]: x
Out[23]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

# 함수 사용 결과(배열의 요소 수가 같을 경우)
In[24]: np.resize(x,(5,3))
Out[24]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [12, 13, 14]])

# 함수 사용 결과(배열의 요소 수가 다를 경우)
In[25]: np.resize(x, (5,5))
Out[25]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9]])

# 메서드 사용 결과(원본 배열이 변경됨)
In[26]: x.resize(5,3)
In[27]: x
Out[27]: 
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [12, 13, 14]])


이외에도 배열 형상조작을 할 수 있는 array_split, column_stack, concatenate, diagonal, dsplit, dstack, hsplit, hstack, ndarray.item, newaxis, repeat, squeeze, swapaxes, take, vsplit, vstack와 같은 다양한 함수 및 메서드 들이 존재한다. 


반응형

댓글