무효 클릭 IP 추적 중...
머신러닝,딥러닝/넘파이,numpy

[넘파이 기초] np.resize vs np.reshape 시리즈[1]

꼬예 2021. 4. 9.

넘파이를 사용하다보면 자주 만나게 되는 두녀석!

비슷 한듯 다른 두 API np.resize, np.reshape

여러분들은 잘 사용하고 계신가요? 아마 비슷한거같은데 다르기도 한것같고 애매하신분들이 많을 것 같습니다.

 

오늘은 이 둘의 사용법과 차이를 확인하고 , 잘못 사용하면 어떤 문제가 발생될 수 있는것까지 확인해보는 시간을 가지도록 하겠습니다. 

 

 

 

 

np.reshape

먼저 reshape의 사용법입니다. 

 

import numpy as np  # numpy 를 import 해주고요!

a= np.arange(10) # 1~9 까지 숫자 배열을 a 변수에 넣어줍니다. 
b = np.reshape(a, (2,5)) # 2행 5열 형태로 변경해줘!(re + shape)

print("a ndarray :{}\n a shape : {}".format(a,a.shape)) # a, b 각각 배열과 shape을 확인한다.
print("b ndarray : {}\n b shape : {}".format(b,b.shape))

 

1.  1~9로 이루어진 임의의 배열을 a 변수에 넣습니다.

이때 a에 들어간 배열은 아래와 같은 형태로 출력이 되고 (10,)의 shape을 가지고 있습니다.

 

2. 그 후 reshape을 해볼텐데요 형태를 잘 확인해보세요!

 

np.reshape(a,(2,5)) >>

1) 빨간색 부분에 내가 형태를 바꾸고자하는 값을 즉 여기선 a이죠?

2) 파란색부분에 그 형태를 어떤shape으로 바꿀지 넣어주면 됩니다. 여기선 2행 5열의 형태로 만들고 싶다라고 표현했습니다.

 

그렇다면 b의 값은 어떤 모습일까요?

아래와 같이 2행 5열짜리 행렬로 변경된것을 확인할 수 있습니다. 

말그대로 shape 형태를 바꿔주는 기능을 하는 것입니다. 


위 코드에서는 np.reshape 으로 사용을 하였는데요.

아래와 같이 np.reshape 이 아닌 앞에 변수를 객체로 한 a.reshape의 형태로도 사용가능합니다.

보시다시피 똑같은 결과를 확인할수있으니 편한걸 사용하시면 됩니다.

import numpy as np 
a= np.arange(10)
b = a.reshape((2,5))

print("a ndarray: \n", a)
print("b ndarray: \n",b)

 

 

np.resize

그다음은 resize입니다. 

사람들이 reshape와 resize를 혼동하는 이유는 사실 얼핏 보기에 둘이 같은 기능을 하는것처럼 보이기 때문입니다. 

 

아래 코드는 위에 코드 reshape를 대신해서 resize로만 변경해준 것입니다. 

import numpy as np

a = np.arange(10)

b = np.resize(a, (2,5))
print("a ndarray: \n", a)
print("b ndarray: \n", b)

결과 또한 위와 같이 똑같은걸 확인할 수 있습니다. 

그렇다면..!!  도대체 둘이 뭐가 다른거란 말인가...

 

 

지금까지는 a 에 담은 원소의 갯수와 b(shape을 변경한상태)에 있는 원소의 갯수가 같았습니다. 하지만 둘의 갯수가 다르다면요..? 

 

무슨말인지 확인해보겠습니다.

 

import numpy as np

a = np.arange(6) # 배열에는 6개의 원소가있습니다.

b = np.resize(a, (3,4)) # 변경한 배열에는 3*4 즉 12개의 원소가 있습니다.
print("a ndarray: \n", a)
print("b ndarray: \n", b)

위의 output 결과처럼 기존 원소의 숫자보다 많은 size로 배열의 shape를 변경하다보니 기존의 값들을 다시 꺼내와서(빨간사각형) 쓰는 것을 보실수가 있습니다.

 

똑같은 식으로 reshape에도 적용해볼까요?

import numpy as np

a = np.arange(6)

b = np.reshape(a, (3,4))
print("a ndarray: \n", a)
print("b ndarray: \n", b)

네 그렇습니다.. np.reshape은 크기가 서로 다르면.

ValueError Traceback ... 오류를 발생시킵니다..

 

resizereshape에 비해 좋게 말하면 유연하지만,  나쁘게말하면 너무 관대하다고 할 수도있습니다.

우리는 단순히 shape만 변경 시키고싶어서 np.resize를 사용했는데.. 오타라도 난다면.. 전혀 원하지 않는 결과를 만날 수있으니 주의해야 합니다.

 

 

여기서.!! Tip 들어갑니다. 앞서 reshape에서는 

np.reshape이나 a.reshape이 차이가 없었는데 resize의 경우는 어떨까요?

 

import numpy as np

a = np.arange(9)

b = a.resize((3,3))
print("a ndarray: \n", a)
print("b ndarray: \n", b)

위와 같이 None 값을 내뱉게 됩니다..

 

이게 무슨일일까요..?

resize의 경우는 변경한 값을 return 하지 않습니다. 즉 None값을 b에게 던져주니, b를 print해봤자 당연히 None 값이 나오는것이지요.

 

그럼 변경된 값은 어딨는거냐.!!

return만 하지 않았을뿐이지. 기존에 있는 a값 자체를 변경 시켜버린겁니다.

 

정말 그런지 코드를 통해 확인해볼게요!

import numpy as np

a = np.arange(9)
b = np.resize(a,(3,3))
print("a ndarray: \n", a)

보시는것처럼 np.resize를 통해 a를 변경하였지만 최초 a값은 변경되지 않았습니다. 

np.resize는 원래 값은 변경 하지 않고 변경된 값을 내뱉는 함수!입니다. 여기서는 b한테 값을 return 한것이구요.

 

a.resize는 원래값을 아예 변경 해버리고 변경된 값을 내뱉지 않는 함수(none값 반환)입니다. 

 

마지막으로 a.resize의 형태로 코딩을 하시려면..

아래와 같은 형태로 작성해주시는게 깔끔하겠죠.?

(return 하는 값이 없으니 굳이 b라는 변수를 사용할 필요가 없습니다.)

import numpy as np

a = np.arange(9)

a.resize((3,3))

print(a)

 

사실 이 둘 사이에서는 더 중요하게 알아야할 것이 있습니다.  분량이 길어지는 관계로 2편에서 이어가도록 하겠습니다.

>> np.resize vs np.reshape 시리즈 2

 

이 글과 읽으면 좋은글

 

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글