본문 바로가기
컴퓨터 언어/Python_NumPy

[ Python 3 ] Numpy reshape 함수란. (추가, 다른 형태의 자료를 np.array 활용하여 reshape 이용 가능)

by SuperMemi 2020. 3. 13.
반응형

머신러닝이나 딥러닝을 하다보면 데이터의 구조를 바꿔서 처리할 때가 많은데

이때, numpy reshape을 많이 사용한다.

reshape 함수는 numpy.ndarray의 차원과 모양을 바꿔준다.

 

numpy.ndarray를 잘 모르겠다면 아래의 글을 보고 오길 바란다.

2020/03/14 - [Python] - [ Python 3 ] NumPy란 무엇인가? (ndarray 클래스)

 

[ Python 3 ] NumPy란 무엇인가? (ndarray 클래스)

NumPy 소개 Numpy(보통 "넘파이"라고 발음)는 수치 해석용 Python 패키지이다. 다차원의 행렬 자료구조인 ndarray를 지원하여 벡터와 행렬을 사용하는 선형대수 계산에 주로 사용된다. C로 구현된 CPython에서만..

supermemi.tistory.com


Tip. 데이터의 개수와 형태의 크기는 같아야한다.

Tip. ndarray가 아닌 다른 자료(list, tuple, range)를 바로 reshape하려면 오류가 뜬다.

      이럴 때는, np.array()와 tolist()함수를 이용하자.

 

 

1. 이때 원래의 데이터는 변하지않고 그대로 유지된다.

2. reshape(n, -1) 같이 -1을 이용해서 나타 낼 수도 있다.

     - n의 크기에 맞추어 형태를 정해준다.

3. 다차원 list data, range tuple 자료를 numpy npdarray로 바꾸어 reshape 하기.


예제 1. reshape함수 및 본래 데이터 유지

>>> x = np.arange(20)      # x는 1차원 배열이다.
>>> x          
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19])
       
>>> x.reshape(4,5)         # x를 (4,5) 2차원으로 바꾼 배열을 리턴한다.
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
>>> x.reshape(2,2,5)       # x를 (2,2,5) 3차원으로 바꾼 배열을 리턴한다.
array([[[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9]],

       [[10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]]])
        
>>> x                      # x는 변화하지 않고 그대로 유지됨을 볼 수 있다.
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19])

예제 2. reshape(-1에 대하여)

>>> import numpy as np
>>> x = np.arange(20)            # 1차원 배열.
>>> y = x.reshape(4, -1)         # 데이터개수(20개) = 2차원(4) X 1차원(?)
>>> y                            # 크기가 맞아야 함으로, -1 자리에는 5개로 채워진다.
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
>>> y.shape
(4, 5)
>>> y = x.reshape(2, 5, -1)      # 데이터개수(20개) = 3차원(2) X 2차원(5) X 1차원(?)
>>> y                            # 크기가 맞아야 함으로, -1 자리에는 2개로 채워진다.
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5],
        [ 6,  7],
        [ 8,  9]],

       [[10, 11],
        [12, 13],
        [14, 15],
        [16, 17],
        [18, 19]]])
>>> y.shape
(2, 5, 2)

>>> y.reshape(-1)                 # 데이터개수(20개) = 1차원(?) -> 당연히 20이 될것이다.
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19])

예제 3. 다차원 list data를 reshape 하기. np.array(), tolist().

>>> list_data = [[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]]      # 3차원 (2,2,3) 리스트 데이터.
>>> list_data.reshape(2,3,2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'reshape'      # list는 reshape을 바로 이용할 수 없다.

>>> data = np.array(list_data)                                # np.array()를 이용하여,
>>> type(data)                                                # list를 ndarray로 바꿔준다.
<class 'numpy.ndarray'>
>>> data.reshape(2,3,2)                                       # 3차원 (2,3,2) ndarray가 되었다.
array([[[ 1,  2],
        [ 3,  4],
        [ 5,  6]],

       [[ 7,  8],
        [ 9, 10],
        [11, 12]]])
        
>>> list_data2 = data.tolist()                                # 다시 리스트 형태로 바꾸고 싶다면 tolist()함수를 사용한다.
>>> list_data2
[[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]

range 함수와 tuple 자료도 np.array()를 이용하여 reshape할 수 있다.

>>> x = range(12)
>>> data = np.array(x).reshape(2,2,3)
>>> data
array([[[ 0,  1,  2],
        [ 3,  4,  5]],

       [[ 6,  7,  8],
        [ 9, 10, 11]]])
        
>>> x = (1,2,3,4)
>>> data = np.array(x).reshape(2,2)
>>> data
array([[1, 2],
       [3, 4]])

 

반응형