2014-02-22 2 views
0

ndarray의 평면 반복자가 왜 작동하는지 이해하려고합니다. A을 모양이 (N, N) 인 ndarray라고합시다. 평면 반복자로 ndarray 값 설정하기

A.flat[::N + 1] = 1 

는 값 1A의 대각선 요소를 설정. 따라서 A.flatA에 대한보기와 같이 작동합니다. (A.flat가보기 인 경우는 마찬가지로) 놀랍게도하지만,
A.flat[::N + 1][1:] = 1 

A 수정하지 않습니다.

A.flatA에 대한보기가 아닌 flatiter 개체입니다. 이것의 근거는 무엇입니까? 뷰로 구현할 수 있습니까?

[내가 이해하는 것처럼, 원시 배열 데이터는 배열 길이, 배열 크기, 보폭, 열 순서 등 데이터의 해석에 관한 정보와 별도로 저장됩니다. 따라서 병합을 달성 할 수있는 것으로 보입니다 . (열 순서에 의존하고 보폭) 적절한 치수를 설정하여] 파이썬에서

+0

그 두 가지의'.flags'를 체크하면. 두 번째 것이 자신의 데이터를 소유하고 있지 않음을 알 수 있습니다. – M4rtini

답변

2

, A[a][b] = B에 대략 번역됩니다 :

tmp = A[a] 
tmp[b] = B 

이 파이썬 객체에 대한 잘 작동, 목록 또는 목록의 예 목록 dict하지만 numpy 배열에는 문제가 있습니다. A[a]A의보기 일 때 numpy 배열로 작동하지만 A[a]이 복사되면 작동하지 않습니다. This page은 numpy 배열을 인덱싱 할 때 뷰를 반환 할 때와 복사본을 반환 할 때를 알려줍니다. 나는 flat 속성을 인덱싱하면 항상 복사본을 반환한다고 생각합니다. Numpy 배열을 사용할 때 왼쪽에 []의 두 세트를 피하는 것이 좋습니다.

업데이트 : "평면 속성을보기로 구현할 수 있습니까?"라는 질문에 대한 대답은 무엇입니까? 아니야. Numpy 배열은 임의의 스트라이드를 지원하며 많은 스트라이드 조합의 경우 플랫 배열의 1 차원 뷰를 생성 할 수 없습니다. 가능한 경우 래벨 메서드는 배열 뷰를 반환합니다. 어레이를 뷰로 전개 할 수없는 경우 사본을 리턴합니다. 나는 당신이 당신의 배열이 다음과 같은 것을 할 수있는 뷰로 평평해질 수 있음을 알고 있다면 짐작할 수있다 :

A.ravel()[::N + 1][1:] = 1