본문 바로가기
Computer Science/키워드 스터디

[Memory Views and Copies in Numpy] Numpy 기본기.

by NCTP 2024. 4. 16.

개요

  • 어떤 값을 의도적으로 덮어쓰고 싶을 때는 상관이 없지만, 덮어쓰고 싶지 않을 때 덮어쓰는 실수를 할 수도 있다.
  • == view라는 개념을 잘 이해하지 못하면 우리가 가지고 있는 값을 덮어쓰는 실수를 저지를 수 있다.
  • => view의 개념을 잘 이해함으로써 불필요한 copy를 피할 수 있고, 메모리 자원을 아끼는 데에 큰 도움이 된다.
import numpy as np

ary = np.array([[1,2,3], [4,5,6]])

first_row = ary[0]
first_row += 1

print(first_row)
print(ary[0])

 

출력값

 

  출력값을 보면, 분명 first_row에 ary[0]를 복사에서 더해줬는데, ary[0]에도 똑같이 연산이 수행되었음을 알 수 있다. ary[0]를 first_row에 copy하면서 둘은 서로 link된다는 사실을 기억하자. 

 

  • original value에도 영향을 미친다는 개념이 바로 view.
  • original value 와 copied value 사이에 link가 존재
  • 이를 피하기 위해서는 numpy에서 copy라는 method를 사용하자.
import numpy as np

ary = np.array([[1,2,3], [4,5,6]])

first_row = ary[0].copy()
first_row += 1

print(first_row)
print(ary[0])

 

출력값

  

Fancy Indexing

  • Numpy의 fancy indexing에서는 view가 아니라 copy 값을 반환한다.
  • 일반적인 python list는 인덱싱을 할 때 튜플 값을 사용할 수 없지만, numpy의 fancy indexing은 가능하다.
import numpy as np

ary = np.array([[1,2,3], [4,5,6]])

first_row = ary[:,[1,2]] # Fancy Indexing
first_row += 1

print(first_row)
print(ary[:,[1,2]])

 

출력값

  • Boolean Masking 은 Fancy indexing

댓글