2016-07-04 7 views
3

나는 numpy array indexing에 관한 문서를 읽고 있지만 기본 및 고급 슬라이스를 구분하는 방법에 대해서는 여전히 분명하지 않습니다.numpy 배열의 기본 및 고급 슬라이스 구분

누군가 설명해 주셔서 감사합니다. 간단한 1D 배열

x[(1,2,3),] is fundamentally different than x[(1,2,3)] . The latter is equivalent to x[1,2,3] which will trigger basic selection while the former will trigger advanced indexing. Be sure to understand why this occurs.

Also recognize that x[[1,2,3]] will trigger advanced indexing, whereas x[[1,2,slice(None)]]` will trigger basic slicing.

답변

3

시작 :

In [326]: x=np.arange(10) 

이 두 표현은 같은 일을 - 배열에서 3 개 요소를 선택합니다. 또한 복사본을 반환하는지 확인할 수도 있습니다. 여기에서 x[1:4]은 뷰를 반환합니다.

In [329]: x[(1,2,3)] 
... 
IndexError: too many indices for array 

과 동일 :

In [330]: x[1,2,3] 
IndexError: too many indices for array 

x[1,2,3]는 전화 x.__getitem__((1,2,3))에 파이썬 인터프리터에 의해 변환된다

In [327]: x[(1,2,3),] 
Out[327]: array([1, 2, 3]) 

In [328]: x[[1,2,3]] 
Out[328]: array([1, 2, 3]) 

그러나 명령없이

는 튜플은 오류를 발생시킵니다. 즉, 입력 값은 튜플 형태로 전달됩니다. 이 x[(1,2,3)]에 있으면 차이가 없습니다.

In [338]: ((1,2,3)) 
Out[338]: (1, 2, 3) 

In [339]: ((1,2,3),) 
Out[339]: ((1, 2, 3),) 

x[[1,2,slice(None)]]x[1,2,:]에 해당하지만, 나는 이것을 확인하는 차원 배열을해야합니다 :하지만 첫 번째 표현식의 쉼표 중첩 레이어를 추가합니다.

In [344]: X=np.arange(64).reshape(4,4,4) 
단일 요소의

차원 색인 :

In [345]: X[(1,2,3)] 
Out[345]: 27 

In [346]: X[1,2,3] 
Out[346]: 27 

3D, 지난 차원에 슬라이스 :

In [347]: X[1,2,:] 
Out[347]: array([24, 25, 26, 27]) 

인터프리터 만 평방 색인 브래킷의 : 표기를 허용합니다

In [348]: X[(1,2,:)] 
... 
SyntaxError: invalid syntax 

그러나 slice으로 우리는

In [349]: X[(1,2,slice(None))] 
Out[349]: array([24, 25, 26, 27]) 

In [350]: X[[1,2,slice(None)]] 
Out[350]: array([24, 25, 26, 27]) 

튜플 그것이 (1,2,3)했던 것과 같은 이유가 여기에 작동하는 튜플 또는 목록으로 그것을 쓸 수 있습니다. 나는 그것이 단지 의미가있는 유일한 것이기 때문에 단순히 같은 방법으로 [] 사례를 다루고 있다고 생각합니다. 슬라이스와 숫자를 결합하여 고급 색인을 만드는 것은 이치에 맞지 않습니다.

이 날이 개 항목 플러스 슬라이스 선택할 수 있도록하는 색인 ​​트릭 :

In [354]: x[np.r_[1,3, 6:10]] 
Out[354]: array([1, 3, 6, 7, 8, 9]) 

는하지만 실제로 범위

In [353]: np.r_[1,3, 6:10] 
Out[353]: array([1, 3, 6, 7, 8, 9]) 
에 슬라이스를 확대하고있다