2012-08-24 3 views
22

마지막 치수에서 i 번째 인덱스를 얻기 위해 질적 인 배열을 슬라이딩하고 싶습니다. 3 차원 배열의 경우,이은 다음과 같습니다임의 치수의 울퉁불퉁 한 슬라이스

slice = myarray[:,:,i] 

그러나 나는 등 myarray[:,:,:,i] 필요하고 싶지만 4D 배열 그래서, 임의의 크기의 배열을 할 수있는 기능을 쓰고 있어요. 명시 적으로 배열 크기를 쓰지 않아도 모든 배열에 대해이 슬라이스를 얻을 수있는 방법이 있습니까?

답변

35

않는, ... 또는 Ellipsis가 정확히 : 당신은 대괄호 표기법 외부에서 사용하고자하는 경우는

slice = myarray[...,i] 

줄임표는, 파이썬 개체입니다.

+0

감사합니다. 나는 이것에 대해 몰랐습니다. 내 자신의 대답은 더 일반적인 조각을 허용하지만, 당신은 정말 멋지다. – tiago

+0

@tiago 실제로 항상 슬라이싱 튜플을 만들 수 있습니다. > ou는 거기에서도 'Ellipsis'를 사용할 수 있습니다 ... – seberg

5

실제로 답변을 찾았습니다. numpy's documentation에 명시된 바와 같이 slice 객체를 사용하여이 작업을 수행 할 수 있습니다.

idx = [slice(None)] * (myarray.ndim - 1) + [i] 
my_slice = myarray[idx] 

slice(None)는 해당 인덱스의 모든 요소를 ​​선택하는 것과 같습니다, 마지막은 [I] 마지막 차원의 특정 인덱스를 선택 : 내 특정 경우에,이 그것을 할 것입니다. slice_dim = -1 이전 답변을 재현 -이 slice_dim 모든 사이즈에서 슬라이스를 반환

indx = [Ellipsis]*myarray.ndim 
indx[slice_dim] = i 
slice = myarray[indx] 

: 임의의 차원 슬라이스의 관점에서

+0

저는 이것을 제안하려했으나 실제로 Sebastian의 접근 방식은 훨씬 더 우아합니다! 또한, 귀하의 코드가 실제로 작동한다고 생각하지 않습니다, 당신은 튜플과 함께 목록을 곱한 다음'slice()'객체없이 맨손 인덱스를 연결하고 있습니다. 어쩌면 당신은''slice (None)] * myarray.shape [-1] + [slice (None, i)]' –

+1

@ NiklasB를 의미했을 것입니다. 마지막'[i]'는 정확하지만'Ellipsis'가 사용되지 않으면 첫 번째 부분은 승수에 대해 (myarray.ndim - 1)이어야합니다. – seberg

+0

@Sebastian, 맞아요, 번호를 사용하여 테스트 한 다음 len (myarray.shape [: - 1])을 넣는 것을 잊었습니다. 방금 너의 제안으로 고쳤어. – tiago

2

는 이전 우수한 답변을 확장 할 수 있습니다. 나는 이전 버전보다 읽기 찾을 수 있지만

indx = [Ellipsis]*(slice_dim) + [i] + [Ellipsis]*(myarray.ndim-slice_dim-1) 

: - 완성도를 들어 위 목록의 첫 번째 두 라인에 응축 될 수있다.