1. 복사되지 않는 경우(단순 할당)
배열 객체나 데이터가 복사되지 않고 단순하게 할당된다.
코드
arr1 = np.arange(12) print("arr1 : %s" %arr1) print("arr1의 형태 : %s" %arr1.shape) arr2 = arr1 print(arr2 is arr1) arr2.shape= 3,4 print("arr2의 형태를 바꾼 후, arr1의 형태 : {0} ".format(arr1.shape))
결과
arr1 : [ 0 1 2 3 4 5 6 7 8 9 10 11] arr1의 형태 : 12 True arr2의 형태를 바꾼 후, arr1의 형태 : (3, 4)
2. 뷰 혹은 얕은 복사(Shallow copy)
서로 다른 배열 객체가 같은 데이터를 공유할 수 있다. view 함수는 같은 데이터를 바라보는 새로운 배열 객체를 생성한다.
코드
view1 = arr1.view() print("view1 : ") print(view1) print("view1은 arr1과 서로 다른 배열 객체이다 : 그러므로 {0} " .format(view1 is arr1)) print("view1은 arr1의 데이터의 뷰이므로 데이터를 공유한다 : 그러므로 {0}" .format(view1.base is arr1)) view1.shape = 2,6 print("view1 : ") print(view1) print("view1의 형태를 바꾼 후, arr1의 형태 : {0} " .format(arr1.shape)) view1[1,2] = 1234 print("view1의 데이터를 바꾼 후, arr1 : ") print(arr1)
결과
view1 : [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] view1은 arr1과 서로 다른 배열 객체이다 : 그러므로 False view1은 arr1의 데이터의 뷰이므로 데이터를 공유한다 : 그러므로 True view1 : [[ 0 1 2 3 4 5] [ 6 7 8 9 10 11]] view1의 형태를 바꾼 후, arr1의 형태 : (3, 4) view1의 데이터를 바꾼 후, arr1 : [[ 0 1 2 3 4 5] [ 6 7 1234 9 10 11]]
3. 깊은 복사(Deep copy)
copy함수는 배열과 데이터의 완전한 카피를 생성한다.
코드
dc = arr1.copy() print("dc : ") print(dc) print("dc는 arr1과 서로 다른 배열 객체이다 : 그러므로 {0} " .format(dc is arr1)) print("dc는 arr1과 어떤것도 공유하지 않는다. : 그러므로 {0}" .format(dc.base is arr1)) dc[0,0] = 9999 print("dc의 데이터를 바꾼 후, arr1 : ") print(arr1)
결과
dc : [[ 0 1 2 3] [ 4 5 6 7] [1234 9 10 11]] dc는 arr1과 서로 다른 배열 객체이다 : 그러므로 False dc는 arr1과 어떤것도 공유하지 않는다. : 그러므로 False dc의 데이터를 바꾼 후, arr1 : [[ 0 1 2 3] [ 4 5 6 7] [1234 9 10 11]]