답변:
세 가지 버전 모두 서로 다른 작업을 수행합니다.
B = A
이렇게하면 B
이미 이름이 지정된 기존 개체에 새 이름이 바인딩 A
됩니다. 나중에 동일한 객체를 참조하므로 하나를 제자리에서 수정하면 다른 하나를 통해 변경 사항도 볼 수 있습니다.
B[:] = A
( B[:]=A[:]
? 와 동일 )
이렇게하면 값이 A
기존 배열로 복사 됩니다 B
. 이 작업을 수행하려면 두 배열의 모양이 같아야합니다. B[:] = A[:]
같은 일을합니다 (그러나 B = A[:]
1과 같은 일을합니다).
numpy.copy(B, A)
이것은 법적 구문이 아닙니다. 당신은 아마 B = numpy.copy(A)
. 이것은 2와 거의 동일하지만 배열을 재사용하는 대신 새 배열을 만듭니다 B
. 이전 B
값에 대한 다른 참조가없는 경우 최종 결과는 2와 동일하지만 복사 중에 일시적으로 더 많은 메모리를 사용합니다.
아니면 numpy.copyto(B, A)
합법적이고 2에 해당하는 을 의미했을 수도 있습니다 .
but B = A[:] would do something more like 1
합니까? 이 stackoverflow.com/a/2612815 에 따르면 new_list = old_list[:]
또한 사본입니다.
some_array[:]
을 수행하면 새 배열 객체가 생성되지만 새 객체는 복사되지 않은 원래 배열과 동일한 메모리의 뷰가됩니다. 그것이 내가 더 좋아한다고 말한 이유 B = A
입니다. 실제 복사본이 필요로하는 O(1)
것이 아니라 공간과 시간 만 O(n)
필요합니다.
B=A
참조를 생성B[:]=A
복사하다numpy.copy(B,A)
복사하다마지막 두 개는 추가 메모리가 필요합니다.
깊은 사본을 만들려면 다음을 사용해야합니다. B = copy.deepcopy(A)
B[:] = A
않는 되지 객체 유형, 예를 들어 배열의 깊은 복사본을 만들어 A = np.array([[1,2,3],[4,5]]); B = np.array([None,None], dtype='O')
. 이제 시도해보십시오 B[:] = A; B[0][0]=99
. 이것은 A와 B 모두의 첫 번째 요소를 변경합니다 ! 내가 아는 한, numpy 배열의 딥 카피를 보장하는 다른 방법은copy.deepcopy