python

[numpy] numpy 얕은 복사 | 깊은 복사

전감자(◔◡◔) 2022. 9. 29. 01:14

- 1차원 

'''
    얕은 복사(주소값 복사) 및 깊은 복사 (실제값 복사 ) 개념
    1. 파이썬
    2. numpy
'''
import numpy as np

# 1. 파이썬

# 가. 얕은 복사 ( 주소값 복사 )
# ==> 두개의 변수가 같은 주소를 참조하기 때문에 하나의 변수에서 값을 변경하면 나머지도 영향을 받는다.0
x = [1,2,3]
x2 = x
print(id(x), id(x2)) # 2426196059520 2426196059520
x[0] = 100
print(x, x2) # [100, 2, 3] [100, 2, 3]

# 나. 깊은 복사 ( 실제값 복사) ==> x[:], x.copy(), list(x)
x = [1,2,3]
x2 = x[:] # 많이 사용되는 연산이다. 사용할때마다 매번 새로운 동일한 값들이 생성된다. ==> 메모리 효율이 떨어진다.
x3 = x.copy()
x4 = list(x)
print(id(x), id(x2), id(x3), id(x4)) # 2646889138752 2646889136576 2646888211840 2646889139328
x[0] = 100
print(x, x2, x3, x4) # [100, 2, 3] [1, 2, 3] [1, 2, 3] [1, 2, 3]

# 2. numpy
arr = np.array([1,2,3])
arr2 = arr[:] # numpy는 얕은 복사로 처리됨.
print(id(arr), id(arr2)) # 1575112281328 1575112281520 ==> 주소값은 내부적으로 얕은복사로 처리됨 ( 뷰로 연결 )
arr2[0] = 100
print(arr, arr2) # [100   2   3] [100   2   3]

#numpy 깊은 복사
arr=np.array([1,2,3])
arr2=arr.copy()
arr3=np.copy(arr)
arr[0]=100
print(arr,arr2,arr3)#[100   2   3] [1 2 3]

 

-2차원

'''
    얕은 복사(주소값 복사) 및 깊은 복사 (실제값 복사 ) 개념
    1. 파이썬
    2. numpy
'''
import numpy as np

#가. 얕은 복사(주소값 복사)
# 1. 파이썬
x=[1,2,3,[4,5,6]] #중첩리스트
x2=x
print(id(x),id(x2))#2044951505600 2044951505600
x[0]=100
x[3][0]=400
print(x,x2)

#나. 깊은 복사
#바깥 쪽 리스트는 깊은 복사되고 중첩된 리스트는 얕은 복사
x=[1,2,3,[4,5,6]]
x2=x[:]
print(id(x),id(x2))#2044951505600 2044951505600
x[0]=100 #깊은 복사
x[3][0]=400 #얕은 복사
print(x,x2)

#바깥 쪽 리스트는 깊은 복사되고 중첩 리스트도 깊은 복사되도록 처리하자
import copy

x=[1,2,3,[4,5,6]]
x2=x[:]# 바깥 쪽 리스트는 깊은 복사 중첩리스트는 얕은 복사
x3=copy.deepcopy(x)# 바깥 쪽 리스트는 깊은 복사되고 중첩리스트도 깊은 복사된다.
x[0]=100
x[3][0]=400
print(x,x2,x3)#[100, 2, 3, [400, 5, 6]] [1, 2, 3, [400, 5, 6]] [1, 2, 3, [4, 5, 6]]

# 2.numpy
arr=np.arange(9).reshape(3,3)
print(arr)
'''
[[0 1 2]
 [3 4 5]
 [6 7 8]]
'''

arr2=arr[:]
arr[0]=100
print(arr,arr2)
'''
[[100 100 100]
 [  3   4   5]
 [  6   7   8]] 
 
 [[100 100 100]
 [  3   4   5]
 [  6   7   8]]

'''

import copy
arr=np.arange(9).reshape(3,3)
arr2=copy.deepcopy(arr)
arr[0]=100
print(arr,arr2)
'''
[[100 100 100]
 [  3   4   5]
 [  6   7   8]] 
 
 [[0 1 2]
 [3 4 5]
 [6 7 8]]

'''