데이터 분석을 하다보면
A = ~~~~
B = A.copy()
이런식으로 .copy()라는 메소드가 쓰인 코드를 보신적이 많이 있으실거에요.
이건 왜 쓰는것일까요?
copy()를 쓰지않으면 A 에 담겨있는 값을 B라는 변수명에 담는데.. 같은 메모리를 공유를 하게되요.
다시 말하면 같은 공간을 쓰면서 명칭을 두개나 가지고있게 되는거죠..
그래서 그게 뭐가 문제란 말인가?
쉽게 말하면 같은 공간을 쓰기때문에 B값을 수정하면 원래 값인 A값도 변경되는 문제가 발생됩니다.
B값을 수정해도 변경하지 않게하려면 B만을 위한 새로운 공간을 만들어줘야 해요 이때 사용하는게 copy() 라는 메소드입니다.
지금 이해가 당장 되지 않아도 좋아요!
우리가 알아볼 reshape와 resize의 비교를 통해서 차츰차츰 알아가도록 합시다.
특히 오늘 공부할 내용을 모를경우 데이터 분석할때 크리티컬한 문제가 발생할 수 있음으로,
꼭! 알아두고 가셨으면 좋겠습니다.
np.reshape의 특징
import numpy as np
a = np.arange(6)
b = np.reshape(a, (3,2))
print("a ndarray: \n", a)
print("b ndarray: \n", b)
첫번째 시리즈를 보고 오신분은 익숙하실것같은데요.
ouput은 아래와 나오게 됩니다.
여기서 우리가 새롭게 해보고싶은건
b값의 3행 1열 값인 '4'를 '100'으로 바꾸고 싶습니다. 어떻게할까요?
간단합니다.
import numpy as np
a = np.arange(6)
b = np.reshape(a, (3,2))
b[2,0] = 100
print("a ndarray: \n", a)
print("b ndarray: \n", b)
b[행자리-1,열자리-1] = 변경하고 싶은값
형태로 변경 해주면됩니다.
출력하면 어떻게될까요?
엇! 그런데..
여기서 우리가 주목해야될점이 나옵니다.
분명 우리는 b값을 변경했는데.
기존값인 a값도 따라 변경되어버렸습니다.
위에서 말한 추상적인 개념이 이제 조금 이해되시나요?
즉 reshape을 통해서 새로 생성한 b값은 사실 기존 a랑 같은 메모리 공간을 사용하고 있었던 겁니다.
그게 바로 이 reshape이라는 메소드가 가진 특성입니다.
그럼 위에서 설명한대로 a, b가 다른 공간을 사용하게한다면 b값을 변경해도 원래 값인 a는 변함이 없겠지요?
한번 확인 해봅시다!
import numpy as np
a = np.arange(6)
b = np.reshape(a, (3,2)).copy()
b[2,0] = 100
print("a ndarray: \n", a)
print("b ndarray: \n", b)
새로운 공간을 만들어주기 위해 .copy() 메소드를 추가했습니다.
과연 결과는...
예상대로 새로운 공간을 만들어주니 원래 a값은 변경 되지 않습니다.
그렇다면 resize는 어떨까요?
np.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)
reshape를 할때와 마찬가지로!
a값과 resize를 통해 새로 만든 b값을 위와 같이 준비해둡니다!
이번에는 b의 2행 2열인 '6'을 '100'으로 변경 해보겠습니다. 과연 어떤 결과가 나올까요?
import numpy as np
a = np.arange(10)
b = np.resize(a, (2,5))
b[1,1] = 100
print("a ndarray: \n", a)
print("b ndarray: \n", b)
엇.. 그런데.
np.resize는 np.shape와 다르게 copy()를 적용하지 않아도 그 자체로 새로운 공간을 만들어 값을 저장하는 것을 확인 할 수 있습니다.
정리
1편과 다르게 2편에서는 np.reshape을 사용할때 조심해야 할점을 알게되었습니다.
shape을 변경한 후에 변경한 새로운 shape의 배열에서 특정값을 변경 시키고싶다면!!
원래 값이 바뀌어도 되는지 안되는지에 따라 copy() 메소드를 이용할지 안할지 결정해야겠지요.
이 글과 읽으면 좋은글
'머신러닝,딥러닝 > 넘파이,numpy' 카테고리의 다른 글
[넘파이 기초] int ndarray로 인덱싱 (indexing) 하기 (0) | 2021.04.22 |
---|---|
[넘파이 기초] broadcasting(브로드 캐스팅) 파헤치기 2편 (0) | 2021.04.17 |
[넘파이 기초] broadcasting(브로드 캐스팅) 파헤치기 1편 (0) | 2021.04.16 |
[넘파이 기초] flatten 와 ravel의 차이 | 메모리 관리(.copy() vs .view()) (0) | 2021.04.10 |
[넘파이 기초] np.resize vs np.reshape 시리즈[1] (0) | 2021.04.09 |
댓글