Sunday, November 29, 2015

복사와 뷰(Copies and Views)

배열을 조작할 때, 배열의 데이터가 새로운 배열로 복사되는 경우도 있지만 그렇지 않은 경우가 있다.

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))
새로운 객체는 생성되지 않고, 같은 ndarray 객체는 두 개의 이름을 가진다.(arr1, arr2)

결과
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]]

1 comment:

  1. 안녕하세요 ㅎ 저도 일본서 정보공학부 댕기는 1학년 학생이에요 데이터구조 예습하면서 소트 시간계산량 이해가 잘 안되서 찾아왔어요. 1지망대학 가려고 편입시험내년에 보는데 블로그 보면서 많이 반성도 하고 같은 일본유학생끼리 본받을점도 많은거 같아서 자주자주 오겠습니다. 잘부탁드려요 ㅎ

    ReplyDelete

뉴라이트의 기본적인 개념과 특징

뉴라이트  한국에서 자칭 신우익을 이르는 말. 영어의 신(new) + 우익(right)의 합성어이다.  옛날 종북주의자 시절의 파시즘과 전체주의적 사상을 간직한 채 친일반민족 행위 옹호로 돌아선 사람들이다.  우파를 가장한 짝퉁 우파...