-
[Numpy] copy & view 알아보기 (Shallow, Deep Copy)Python 2024. 3. 18. 07:05728x90반응형
- 목차
키워드.
- Shallow & Deep Copy.
Copy & View.
Numpy 의 ndarray 는 copy 와 view 라는 함수를 제공합니다.
Numpy 의 copy 와 view 함수는 ndarray 를 복사하는 기능을 수행하는데요.
copy 는 Shallow Copy , view 는 Deep Copy 기능을 제공합니다.
Shallow Copy.
프로그래밍에서 Copy 는 Shallow 와 Deep Copy 로 나뉘어집니다.
각 Copy 는 우리말로 얕은 복사와 깊은 복사라고 하는데요.
Shallow Copy (얕은 복사) 로 복사된 데이터는 메모리에 상주하는 원본 객체의 레퍼런스를 유지합니다.
반면 Deep Copy (깊은 복사) 는 원본 객체의 레퍼런스를 유지하지 않고 오로지 값만을 복사하게 됩니다.
만약 Shallow Copy (얕은 복사) 로 카피된 데이터는 원본 객체와 연결되어 있기 때문에
원본 데이터 또는 복사된 데이터를 수정할 경우에 두 데이터 모두 변경됩니다.
예를 들어보도록 하겠습니다.
3개의 객체를 생성합니다.
1. 기본적인 python list 와
2. Numpy Array 그리고
3. Shallow Copy 된 Numpy Array 입니다.
import numpy as np original_python_list = [1,2,3,4,5] original_np_list = np.array(original_python_list) copied_np_list = original_np_list.view() print(f"original_python_list {original_python_list}") print(f"original_np_list {original_np_list}") print(f"copied_np_list {copied_np_list}")
original_python_list [1, 2, 3, 4, 5] original_np_list [1 2 3 4 5] copied_np_list [1 2 3 4 5]
만약 원본 데이터로 사용된 Python List 의 값을 변경하게 되면, 이들은 Numpy Array 에게 어떠한 영향을 주지 않습니다.
오직 Python List 의 값만이 변경됩니다.
여기서 알 수 있는 점은 Numpy Array 가 Python List 객체를 활용하여 생성되어 질때 Python List 객체의 레퍼런스를 사용하지 않는다는 점입니다.
즉, Python List 의 레퍼런스가 아니라 값만을 사용합니다.
original_python_list[0] = -1 print(f"original_python_list {original_python_list}") print(f"original_np_list {original_np_list}") print(f"copied_np_list {copied_np_list}")
original_python_list [-1, 2, 3, 4, 5] original_np_list [1 2 3 4 5] copied_np_list [1 2 3 4 5]
반면 Numpy Array 데이터가 변경되는 경우에는 결과가 달라집니다.
View 함수를 통해서 얕은 복사된 copied_np_list 의 값이 변경되게 됩니다.
original_np_list[0] = -100 print(f"original_python_list {original_python_list}") print(f"original_np_list {original_np_list}") print(f"copied_np_list {copied_np_list}")
original_python_list [-1, 2, 3, 4, 5] original_np_list [-100 2 3 4 5] copied_np_list [-100 2 3 4 5]
Deep Copy.
Numpy 의 copy 함수를 사용하면 Deep Copy 를 수행할 수 있습니다.
Deep Copy (깊은 복사) 는 복사된 객체가 원본 객체의 레퍼런스를 유지하지 않습니다.
오직 값만을 복사합니다.
import numpy as np original_python_list = [1,2,3,4,5] original_np_list = np.array(original_python_list) copied_np_list = original_np_list.copy() print(f"original_python_list {original_python_list}") print(f"original_np_list {original_np_list}") print(f"copied_np_list {copied_np_list}")
아래의 경우는 원본 Numpy Array 와 복사된 Numpy Array 를 각각 수정합니다.
원본 Numpy Array 의 첫번째 원소의 값을 -1 로 변경하고, 복사된 Numpy Array 의 첫번째 원소의 값을 -2 로 변경합니다.
Shallow Copy 가 된 경우라면 두 Numpy Array 의 값을 동일해야합니다.
하지만 Deep Copy 가 된 경우이기 때문에 원본 Numpy Array 와 복사된 Numpy Array 는 독립적으로 존재합니다.
즉, Numpy Array 가 수정되어도 서로 영향을 끼치지 않습니다.
original_np_list[0] = -1 copied_np_list[0] = -2 print(f"original_np_list {original_np_list}") print(f"copied_np_list {copied_np_list}")
original_np_list [-1 2 3 4 5] copied_np_list [-2 2 3 4 5]
마치며.
Numpy 에서 ndarray 를 복사하기 위한 두가지 함수인 copy 와 view 에 대해서 다루어보았습니다.
view 함수는 이름처럼 원본 데이터를 보기만 한다는 관점에서 얕은 복사를 수행합니다.
즉, 이는 메모리적인 이득을 취할 수 있습니다.
하지만 copy 함수는 원본 데이터와 동일한 데이터를 복사하기 때문에 메모리 상에 동일한 데이터가 복제되어 존재합니다.
즉, 메모리 사용 관점에서 부담이 생길 수 있습니다.
사용하는 목적에 맞게 어떠한 복제 방식을 사용할지 결정하는 것이 중요합니다.
반응형'Python' 카테고리의 다른 글
[Pandas] DataFrame pd.merge 알아보기 (Join) (0) 2024.04.09 [Python] yield 알아보기 ( generator ) (0) 2024.04.06 [Pandas] DataFrame concat 알아보기 (0) 2024.03.09 [Numpy] Boolean Indexing 알아보기 ( Boolean Mask ) (0) 2024.03.09 [Python] threading Condition 알아보기 ( wait, notify ) (0) 2024.03.09