반응형
머신러닝이나 딥러닝을 하다보면 데이터의 구조를 바꿔서 처리할 때가 많은데
이때, numpy reshape을 많이 사용한다.
reshape 함수는 numpy.ndarray의 차원과 모양을 바꿔준다.
numpy.ndarray를 잘 모르겠다면 아래의 글을 보고 오길 바란다.
2020/03/14 - [Python] - [ Python 3 ] NumPy란 무엇인가? (ndarray 클래스)
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]])
반응형