본문 바로가기

컴퓨터공학/python

[Numpy] ndarray를 알아보자2(reshape, resize,copy,view)

이번 글에서는 ndarray의 reshape , resize, copy, view에 대해 알아보도록 하겠습니다.

 

reshape으로 채워지는 순서

 

 

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에 대해 다뤄보도록 하겠습니다.