2017-12-30 3 views
1

(4,3)의 모양이 A이고 1 차원 배열 a이 모양이 (4,) 인 2D 배열이 있습니다. 먼저 A의 처음 두 행과 a의 처음 두 요소를 교환하고 싶습니다.배열 대 대 스칼라에서의 파이썬 할당

A[0,:],A[1,:] = A[1,:],A[0,:] 
a[0],a[1] = a[1],a[0] 

분명히, 그것은 a을 위해 작동하지만, A 실패 : 나는 다음과 같은 않았다. 이제 두 번째 행이 첫 번째 행이되지만 첫 번째 행은 변경되지 않습니다. 다음과 같이하면 :

first_row_copy = A[0,:].copy() 
A[0,:] = A[1,:] 
A[1,:] = first_row_copy 

그런 다음 작동하는 것 같습니다. 첫 번째 방법이 효과가없는 이유는 무엇입니까? (그러나 a에서 작동) A_copy = A[0,:].copy()A_copy = A[0,:]의 차이점은 무엇입니까?

답변

5

numpy 슬라이스는 기본 메모리의 보기입니다. 기본적으로 독립 실행 형 복사본을 만들지 않습니다 (이것은 성능/메모리 최적화입니다). 그래서 :

A[0,:],A[1,:] = A[1,:],A[0,:] 

A[1,:]의 전망과 A[0,:]의 뷰를 만듭니다 다음 A[1,:]의 관점에서 무엇을 동일하게 A[0,:]의 값을 할당합니다. 그러나 A[1,:]을 할당하면 A[0,:] 님의보기에는 복사 후 데이터가 표시되므로 잘못된 결과가 표시됩니다. 간단히 여기에 두 번째 요소에 .copy를 추가하는 것은이 경우에 충분하다 : 오른쪽에 튜플은 항상 왼쪽에 할당하기 전에 완전히 구성되어

A[0,:], A[1,:] = A[1,:], A[0,:].copy() 

때문에 첫 번째 과제에 대한 라이브 뷰를 사용할 수 있도록, 시작 두 번째 할당 값을 보존하기 위해 복사본을 만들면됩니다.

+0

그러면 'a'가 왜 작동합니까? 그것은 numpy 슬라이스가 아니기 때문에 기본적으로 복사를 만들고 있습니까? – Physicist

+0

@ 물리학 자 : 단일 값에 대한 일반 색인화는 사본을 만듭니다 (이 경우 메모리를 복사하지 않아도 얻을 수있는 것은 없습니다). – ShadowRanger