사본이있는 Numpy 배열 할당


103

예를 들어, 우리는이 경우 numpy배열을 A, 그리고 우리는 원하는 numpy배열 B같은 요소를.

다음 (아래 참조) 방법의 차이점은 무엇입니까? 추가 메모리는 언제 할당되고 언제 할당되지 않습니까?

  1. B = A
  2. B[:] = A( B[:]=A[:]? 와 동일 )
  3. numpy.copy(B, A)

답변:


127

세 가지 버전 모두 서로 다른 작업을 수행합니다.

  1. B = A

    이렇게하면 B이미 이름이 지정된 기존 개체에 새 이름이 바인딩 A됩니다. 나중에 동일한 객체를 참조하므로 하나를 제자리에서 수정하면 다른 하나를 통해 변경 사항도 볼 수 있습니다.

  2. B[:] = A( B[:]=A[:]? 와 동일 )

    이렇게하면 값이 A기존 배열로 복사 됩니다 B. 이 작업을 수행하려면 두 배열의 모양이 같아야합니다. B[:] = A[:]같은 일을합니다 (그러나 B = A[:]1과 같은 일을합니다).

  3. numpy.copy(B, A)

    이것은 법적 구문이 아닙니다. 당신은 아마 B = numpy.copy(A). 이것은 2와 거의 동일하지만 배열을 재사용하는 대신 새 배열을 만듭니다 B. 이전 B값에 대한 다른 참조가없는 경우 최종 결과는 2와 동일하지만 복사 중에 일시적으로 더 많은 메모리를 사용합니다.

    아니면 numpy.copyto(B, A)합법적이고 2에 해당하는 을 의미했을 수도 있습니다 .


21
@Mr_and_Mrs_D : Numpy 배열은 목록과 다르게 작동합니다. 어레이를 슬라이싱하는 것은 복사본을 만드는 것이 아니라 기존 어레이의 데이터에 대한 새로운 뷰를 생성 할뿐입니다.
Blckknght

무엇을 의미 but B = A[:] would do something more like 1합니까? 이 stackoverflow.com/a/2612815 에 따르면 new_list = old_list[:]또한 사본입니다.
mrgloom

4
@mrgloom : Numpy 배열은 내용을 자르고 복사 할 때 목록과 다르게 작동합니다. 배열은 숫자 값이 저장되는 기본 메모리 블록의 "뷰"입니다. 슬라이스와 같은 작업 some_array[:]을 수행하면 새 배열 객체가 생성되지만 새 객체는 복사되지 않은 원래 배열과 동일한 메모리의 뷰가됩니다. 그것이 내가 더 좋아한다고 말한 이유 B = A입니다. 실제 복사본이 필요로하는 O(1)것이 아니라 공간과 시간 만 O(n)필요합니다.
Blckknght

27
  1. B=A 참조를 생성
  2. B[:]=A 복사하다
  3. numpy.copy(B,A) 복사하다

마지막 두 개는 추가 메모리가 필요합니다.

깊은 사본을 만들려면 다음을 사용해야합니다. B = copy.deepcopy(A)


2
두 번째 예를 다스 려하는 것은 : 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
Rolf Bartstra

11

이것이 저에게 유일한 해결책입니다.

B=numpy.array(A)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.