이번 글에서는 ndarray의 reshape , resize, copy, view에 대해 알아보도록 하겠습니다.
1. numpy.reshape(a,newshape,order='c')
np.reshape은 원하는 tensor의 형태로 변환해주는 API입니다.
아래는 shape (,6) 을 shape (2,3)으로 변환해주는 예시 코드와 결괏값입니다.
import numpy as np
a= np.arange(6)
b= np.reshape(a,(2,3))
print("original ndarray: \n",a)
print("reshaped ndarray: \n",b)
original ndarray:
[0 1 2 3 4 5]
reshaped ndarray:
[[0 1 2]
[3 4 5]]
print("original dimension: \n",a.ndim)
print("original dimension: \n",b.ndim)
original dimension:
1
reshaped dimension:
2
다시 말해 vector(ndim=1)를 matrix(ndim=2)의 형태로 변환시켜준것이죠.
(여기서 ndim은 ndarray의 tensor를 확인해볼 수 있는 numpy의 API입니다.)
변환된 후 원소가 채워지는 순서는 (x1,x2 , ... ,xn) 이 있다면 x1부터 xn 순서로 채워집니다.
(1,1) (1,2) (1,3) 순서로 [0,1,2]가 채워진 후 (2,1) (2,2) (2,3)에 [3,4,5]가 채워진것이죠.
그렇다면 a=np.array(12) 를 (2,3,2) 로 reshape 하면 어떻게 될까요?
정답은 바로 아래와 같습니다.
import numpy as np
a= np.arange(12)
b= np.reshape(a,(2,3,2))
print("original ndarray: \n",a)
print("reshaped ndarray: \n",b)
print("original dimension: \n",a.ndim)
print("original dimension: \n",b.ndim)
original ndarray:
[ 0 1 2 3 4 5 6 7 8 9 10 11]
reshaped ndarray:
[[[ 0 1]
[ 2 3]
[ 4 5]]
[[ 6 7]
[ 8 9]
[10 11]]]
original dimension:
1
original dimension:
3
추가적으로 reshape은 '-1'을 이용해 나머지 차원을 스스로 맞춰서 계산해주는 기능이 있습니다.
아래를 보면 (1,3,4,-1) 을 넣어줬는데 결과 shape가 (1,3,4,2)로 차원이 맞춰준 결과를 볼 수 있습니다.
import numpy as np
a= np.arange(24)
b= np.reshape(a,(1,3,4,-1))
print("original ndarray's shape: \n",a.shape)
print("reshaped ndarray's shape: \n",b.shape)
original ndarray's shape:
(24,)
reshaped ndarray's shape:
(1, 3, 4, 2)
2. numpy.resize(a,new_shape)
np.resize는 new_shape에 맞춰 부족하면 자르고 남으면 반복해서 채워주는 API입니다.
아래 예시에서 남은 (2,3) (2,4) 공간을 0 ,1 이 순서대로 채워진 모습을 볼 수 있습니다.
import numpy as np
a = np.arange(6)
b = np.resize(a,(2,4))
print("original ndarray(a): \n",a)
print("resized ndarray(b): \n",b)
original ndarray(a):
[0 1 2 3 4 5]
resized ndarray(b):
[[0 1 2 3]
[4 5 0 1]]
이번에는 부족하니 자른 모습을 볼 수 있습니다.
import numpy as np
a = np.arange(6)
b = np.resize(a,(2,2))
print("original ndarray(a): \n",a)
print("reshaped ndarray(b): \n",b)
original ndarray(a):
[0 1 2 3 4 5]
reshaped ndarray(b):
[[0 1]
[2 3]]
resize의 특징은 shape를 수정후 저장(copy, 덮어씌우기)를 한다는 것입니다.
(Change shape and size of array in-place)
이후 결과에도 영향을 미치게 되는것이죠.
반대로 indexing 과 slicing과 같이 원본이 변경되지 않는 반대의 개념으로 view의 특징이 있습니다.
reshape 또한 기본적으로 view를 만들어줍니다.
아래 예시를 통해 쉽게 이해해 보도록 하겠습니다.
import numpy as np
a= np.arange(6)
b= a.copy()
c= a.view()
d= a[0:3]
e= np.reshape(a,(2,3))
print(b.base is a) #False
print(c.base is a) #True
print(d.base is a) #True
print(e.base is a) #True
이번 글에서는 reshape resize copy view에 대해 간략히 알아보았습니다.
다음 글에서는 Element-wise Operations 와 Broadcasiting에 대해 다뤄보도록 하겠습니다.
'컴퓨터공학 > python' 카테고리의 다른 글
[Numpy] General Broadcasting Rules에 대하여 (작성중) (0) | 2021.10.05 |
---|---|
[Numpy] Data type에 대하여 (0) | 2021.10.01 |
[Numpy] ndarray에 대해 (0) | 2021.09.30 |
[python] 파이썬이 동작하는 방식에 대해서2 (가상머신) (0) | 2021.09.30 |
[python] 파이썬이 동작하는 방식에 대해서 1 (0) | 2021.09.28 |