2014-09-10 2 views
1

중첩 된 인덱스 목록에 따라 다차원 변수의 요소를 반환하는 함수를 정의하려고합니다. 여러 변수 (예 : 시간, 고도, 위도, 경도)에 따라 변수를 사용하고 있습니다.파이썬에서 다중 차원 목록의 요소를 반환하는 함수

이 3D 지금 (예를 들면, 시간, 고도와 위도)에 대한 확인 : 지금 처음 4 시간 단계, 처음 3 개 고도 수준 및 제 2 위도을 원하는 경우에

x = np.arange(125).reshape(5,5,5) 

내가 여러 작업을 수행 할 수 있습니다 일 :

x[[0,1,2,3],:,:][:,[0,1,2],:][:,:,[0,1]] 

또는

x[ [[[0]],[[1]],[[2]],[[3]]],[[0],[1],[2]],[0,1]] 

또는

x[np.ix_([0,1,2,3],[0,1,2],[0,1])] 

하지만 함수가 l는 인덱스

l = [[0,1,2,3],[0,1,2],[0,1]] 

이 기능이 같은 방법을 볼 수 있었다

의 목록입니다

def get_elements(x, l) 

같은 요소를 날 다시주고 싶은거야? 마지막 대안은 매우 가까이에 있지만 x[np.ix_(l)]은 나를 IndexError라고합니다.

또한 크기를 그대로 유지할 수있는 기회를 갖는 것이 좋습니다. 예 :이 의사 코드의 모든 시간 단계 사용 :

l = [[:],[0,1,2],[0,1]] 

감사합니다.

답변

1

np.ix_의 서명 :

np.ix_(*args) 

그래서 당신은 l을 '확장'해야
x[np.ix_(*l)] 

ix_의 코드를 살펴 보자. args을 반복하고 터플을 반환한다는 것을주의하십시오. np.lib.index_tricks에서 다른 기능을 살펴보십시오.

일반적으로 목록에서 색인을 생성 할 때 문제가 발생하는 경우 튜플을 사용해야하는지 여부를 확인하십시오. slice에 익숙해 져야합니다.

+0

좋아요! 그것은 내가 실제로 찾고 있었던 바로 그 것이다. 나는 그걸 찾는 방법을 몰랐다. 그러나 '확장'이 트릭을 만들었습니다. 또한 여기를보십시오 : [http://stackoverflow.com/questions/7745952/python-expand-list-to-function-arguments] – Lukas

1

직접 당신이 당신의 np.ix_ 기능을 사용해야합니다,하지만 당신이 그것을 구성하고 귀하의 목록을 사용하여 함수를 만드는 방법에 대한 귀하의 질문에 대답하려면 :

def get_elements(x, l): 
    return x[np.ix_(*l)] 

그러나, 내 생각을

:

>>> x[:4,:3,:2] 
array([[[ 0, 1], 
     [ 5, 6], 
     [10, 11]], 

     [[25, 26], 
     [30, 31], 
     [35, 36]], 

     [[50, 51], 
     [55, 56], 
     [60, 61]], 

     [[75, 76], 
     [80, 81], 
     [85, 86]]]) 

그것은이 같은 반환 : 당신이 원하는3210

여기에 슬라이스에 큰 답이있다 : 당신은 당신의 슬라이스 객체의 이름을 지정하고 다음과 같이 전달할 수

https://stackoverflow.com/a/24713353/541136 :

>>> first_four_slice = slice(None, 4) 
>>> first_three_slice = slice(None, 3) 
>>> first_two_slice = slice(None, 2) 
>>> x[first_four_slice, first_three_slice, first_two_slice] 

당신은 너무 하나의 변수에 모두 함께 포장 할 수 있습니다

>>> slice_tuple = first_four_slice, first_three_slice, first_two_slice 
>>> x[slice_tuple] 

과 같이 (즉, 해당 차원에서 모든 수) 당신의 모든 "시간 단계"를 얻을 :

>>> all_slice = slice(None) 
>>> x[all_slice, first_three_slice, first_two_slice] 
관련 문제