NumPy copy() vs view() 완벽 정리! 🧠
1. 시작은 멘붕이었다... 🤯
처음엔 배열을 새로 복사한 줄 알았는데 원본까지 바뀌는 바람에 혼란이 왔어요. x = arr[1:3]
은 독립체가 아니었습니다!
2. copy() vs view() 기본 개념 정리
- copy(): 값을 완전히 복사한 독립체
- view(): 메모리를 공유하는 연결된 사본
copy는 독립체, view는 연결된 쌍둥이! 👯
3. 왜 view()가 필요할까? 🤔
원본 전체를 복사하면 부담되니까요. 필요한 부분만 살짝 수정하거나 관찰하고 싶을 때 view가 탁월합니다!
4. 슬라이싱도 사실 view! 😲
arr = np.array([1, 2, 3, 4, 5])
x = arr[1:3]
x[0] = 999
print(arr) # [1 999 3 4 5]
슬라이싱 = view! 새로운 배열을 만든 게 아닙니다!
5. .base 속성으로 원본 확인하기 🔍
x.base is arr # True (view)
y = arr.copy()
y.base is None # True (copy)
.base로 원본과 연결됐는지 바로 확인할 수 있어요.
copy()는 완전 독립체니까 이것 자체가 원본이라 따로 base가 없습니다.
6. view에서 수정하면 원본 수정됨 💥
view는 원본 메모리를 공유해요. 즉, view를 수정하면 원본이 바로 영향을 받아요. 마치 '한 몸에 여러 이름표를 붙인 것'과 같아요. 한쪽 이름표를 찢으면 몸도 상처를 입는 셈이죠. 🩹
copy는 완전 독립체니까(자체로 원본) 이 copy된 변수의 값을 수정해도 복사 대상과는 상관없으니 혼자만 바뀌죠.
7. 언제 copy(), 언제 view()? ⚡
- copy()를 써야 할 때: 원본을 절대 수정하면 안 될 때
- view()를 써야 할 때: 원본 일부만 관찰하거나 빠르게 작업할 때
8. copy()는 메모리 왜 무겁나? 🏋️
copy는 단순히 주소만 복사하는 게 아니라, 값 하나하나를 풀어서 새로운 메모리에 복사해요. 예를 들어 100만 개짜리 배열을 copy하면(단순 loop 형식으로 되어있어도), 100만 개를 전부 새로 만든다는 얘기! 📦📦📦
🎉 핵심 정리
view는 빠르고 가볍지만 원본을 건드릴 수 있다.
copy는 안전하지만 느리고 메모리 사용량이 크다.