하자 인용 NumPy와 설명서 : https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#advanced-indexing왜 데이터 복사본이 원래 데이터를 수정하는 것처럼 보입니까?
선택 개체, OBJ, (데이터 유형 정수 또는 부울의) 비 튜플 시퀀스 객체, ndarray, 또는 가진 튜플 때고급 인덱싱가 트리거 이상 하나의 시퀀스 객체 또는 ndarray (정수 또는 부울 데이터 유형). 고급 인덱싱에는 정수와 부울의 두 가지 유형이 있습니다.
고급 인덱싱은 항상 데이터 복사본을 반환합니다 (뷰를 반환하는 기본 슬라이스와 대조).
그런 다음 고급 색인화에서 반환 된 항목을 조작하면 원래 배열이 수정되지 않아야합니다. 그리고 실제로 :
import numpy as np
arr = np.array([0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
indexes = np.array([3, 6, 4])
slicedArr = arr[indexes]
slicedArr *= 5
arr
이 인쇄 :
array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
그러나 항상 그런 될 것 같지 않습니다. 이상하게도 내가 중간 배열에 []
연산자에 의해 반환 된 것을 저장하지 않으면 어떻게 든 원래 배열에서 작동합니다.
import numpy as np
arr = np.array([0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
indexes = np.array([3, 6, 4])
arr[indexes] *= 5
arr
이 인쇄 : 나는 불평하지 않는
array([ 0, 10, 20, 150, 200, 50, 300, 70, 80, 90])
이 예제를 고려하시기 바랍니다. 실제로, 이것은 나를 위해 생명의 은인입니다. 그러나, 나는 이것이 왜 효과가 있고, 이것을 정말로 이해하고 싶어하는지 이해하지 못합니다.
최대한 빨리 arr[indexes]
을 작성하자마자 배열 복사본을 만듭니다. 후속 *= 5
은 원래 배열이 아닌이 복사본에서 작동해야합니다. 그러나이 계산 결과는 변수에 쓰여지지 않으므로 버려야합니다.
분명히 나는 틀 렸습니다.
내 오해는 어디에서 왔습니까?
의 차이는 첫 번째 예는'를 통해가는 것을 __getitem__'가해야하기 때문에 사본을 수행하는 다음,
__imul__
는 현재 위치에서 곱셈 "마법의 방법"입니다. 두 번째 예제는 'var [idx]'형식의 무언가에 할당하면 구현이보기로 표현할 수없는 무언가에 직접 할당 할 수있게 해주는'var .__ setitem__'을 호출하기 때문에 두 번째 예제는 동일하지 않습니다. –두 번째 예제는 _assigns_ to'arr [ 색인]'첫 번째 예제는 그렇지 않습니다. –
C++과 달리 'a [b] = c'는 "a [b]'"를 검색하고 "당신이 검색 한 것에 할당"으로 분해 할 수 없습니다. 인덱스 할당은 인덱스 검색 및 일반 할당과는 다른 단일 작업입니다. – user2357112