English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
복제는 데이터의 완전한 복제입니다. 우리가 복제를 수정하면, 원본 데이터에 영향을 미치지 않습니다. 물리 메모리는 동일한 위치에 있지 않습니다.
뷰는 데이터의 별칭이나 참조로, 이 별칭이나 참조를 통해 원본 데이터에 접근하고操作할 수 있지만, 원본 데이터는 복제가 생성되지 않습니다. 우리가 뷰를 수정하면, 원본 데이터에 영향을 미치고, 물리 메모리는 동일한 위치에 있습니다.
복제와 배열 뷰 간의 주요 차이점은 복제가 새 배열이고, 이 뷰는 원본 배열의 뷰일 뿐입니다.복제는 데이터를 소유하며, 복제에 대해 수행하는 모든 변경 사항은 원본 배열에 영향을 미치지 않습니다. 또한, 원본 배열에 대해 수행하는 모든 변경 사항은 복제에 영향을 미치지 않습니다.뷰는 데이터를 소유하지 않으며, 뷰에 대해 수행하는 모든 변경 사항은 원본 배열에 영향을 미칩니다. 또한, 원본 배열에 대해 수행하는 모든 변경 사항은 뷰에 영향을 미칩니다.
1、numpy의 슬라이싱 연산이 원본 데이터의 뷰를 반환합니다.2、ndarray의 view() 함수를 호출하여 뷰를 생성합니다.
Python 시리즈의 슬라이싱 연산, deepCopy() 함수를 호출합니다.ndarray의 copy() 함수를 호출하여 복제를 생성합니다.
간단한 할당은 배열 객체의 복사를 생성하지 않습니다. 대신, 원본 배열의 같은 id()를 사용하여 접근합니다. id()는 Python 객체의 일반 식별자를 반환하며, C의 포인터와 유사합니다. 또한, 배열의 어떤 변경도 다른 배열에 반영됩니다. 예를 들어, 배열의 형태 변경은 다른 배열의 형태도 변경합니다.
>>> import numpy as np >>> a = np.arange(6) >>> print ('우리의 배열은:',a) 우리의 배열은: [0 1 2 3 4 5] >>> print ('id() 함수 호출:',id(a)) >>> id() 함수 호출: 4553321728 >>> b = a >>> print (b) >>> [0 1 2 3 4 5] >>> print ('b는 같은 id()를 가집니다:',id(b)) b는 같은 id()를 가집니다: 4553321728 >>> b.shape = 3,2 >>> print (b) [[0 1] [2 3] [4 5]] [[0 1] [2 3] [4 5]] >>>,
ndarray.view()는 새 배열 객체를 생성합니다. 이 메서드가 생성하는 새 배열의 차원 변경은 원본 데이터의 차원 변경을 변경하지 않습니다. 뷰 또는 얕은 복사
import numpy as np # 처음에 a는 3X2 의 배열 a = np.arange(6).reshape(3,2) print ('배열 a:') print (a) print ('a의 뷰 생성:') b = a.view() print (b) print ('두 배열의 id()는 다릅니다:') print ('a의 id():') print (id(a)) print ('b의 id():' ) print (id(b)) # b의 형태를 수정하면 a를 수정하지 않습니다 b.shape = 2,3 print ('b의 형태:') print (b) print ('a의 형태:') print (a)
출력 결과는 다음과 같습니다:
배열 a: [[0 1] [2 3] [4 5]] a의 뷰 생성: [[0 1] [2 3] [4 5]] 두 배열의 id()는 다릅니다: a의 id(): 4314786992 b의 id(): 4315171296 b의 형태: [[0 1 2] [3 4 5]] a의 형태: [[0 1] [2 3] [4 5]]
데이터를 수정하는 슬라이스 생성은 원본 배열에 영향을 미칩니다:
import numpy as np arr = np.arange(12) print ('우리의 배열:') print (arr) print ('스ライ스 생성:') a=arr[2:] b=arr[2:] a[1])=123456 b[2])=23445 print(arr) print(id(a),id(b),id(arr[3:]))
출력 결과는 다음과 같습니다:
우리의 배열: [ 0 1 2 3 4 5 6 7 8 9 10 11] 스ライ스 생성: [ 0 1 2 123456 23445 5 6 7 8 9 10 11] 4669930672 4444330304 4670012352 프로세스가 종료되었습니다. 종료 코드 0
변수 a, b는 arr의 일부 뷰입니다. 뷰를 수정하면 원래 데이터에 직접 반영됩니다. 그러나 a, b의 id를观察하면 다르다는 것을 알 수 있습니다. 즉, 뷰는 원래 데이터를 가리키지만, 그들은 할당 참조와는 다릅니다.
ndarray.copy() 함수는 복사를 생성합니다. 복사 데이터를 수정하면 원래 데이터에 영향을 미치지 않으며, 물리 메모리는 같은 위치에 있지 않습니다.
import numpy as np a = np.array([10,10], [2,3], [4,5]] print ('배열 a:') print (a) print ('a의 깊은 복사를 생성하다:') b = a.copy() print ('배열 b:') print (b) # b와 a는 어떤 내용도 공유하지 않습니다 print ('b를 통해 a에 쓸 수 있을까요?') print (b is a) print ('b의 내용을 수정하다:') b[0,0] = 100 print ('수정된 배열 b:') print (b) print ('a 변경하지 않기:') print (a)
출력 결과는 다음과 같습니다:
배열 a: [[10 10] [ 2 3] [ 4 5]] a의 깊은 복사를 생성하다: 배열 b: [[10 10] [ 2 3] [ 4 5]] b를 통해 a에 쓸 수 있을까요? False b의 내용을 수정하다: 수정된 배열 b: [[100 10] [ 2 3] [ 4 5]] a 변경하지 않기: [[10 10] [ 2 3] [ 4 5]]