ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Numpy] copy & view 알아보기 (Shallow, Deep Copy)
    Python 2024. 3. 18. 07:05
    728x90
    반응형

     

    - 목차

     

    키워드.

    • Shallow & Deep Copy.

     

    Copy & View.

    Numpyndarraycopyview 라는 함수를 제공합니다.

    Numpycopyview 함수는 ndarray 를 복사하는 기능을 수행하는데요.

    copyShallow Copy , viewDeep Copy 기능을 제공합니다.

     

    Shallow Copy.

    프로그래밍에서 CopyShallowDeep 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 함수는 원본 데이터와 동일한 데이터를 복사하기 때문에 메모리 상에 동일한 데이터가 복제되어 존재합니다.

    즉, 메모리 사용 관점에서 부담이 생길 수 있습니다.

    사용하는 목적에 맞게 어떠한 복제 방식을 사용할지 결정하는 것이 중요합니다.

     

     

     

     

    반응형
Designed by Tistory.