2013-05-07 2 views
1

4 차원 배열이 있고이 배열의 모든 1 차원 벡터를 주어진 치수를 따라 처리해야합니다.다차원 배열에서 일부 치수 선택

 
    def myfun(arr4d,selected_dim): # selected_dim can only be 2 or 3 
     print arr4d.shape # (2, 5, 10, 10) 
     for i in xrange(arr4d.shape[0]): 
      for j in xrange(arr4d.shape[1]): 
       for k in xrange(arr4d.shape[selected_dim]): 
        if selected_dim==2: 
         arr=arr4d[i,j,k,:] 
        elif selected_dim==3: 
         arr=arr4d[i,j,:,k] 
        do_something(arr) # arr is 1-D and has 10 items 

을 ...하지만 난 중첩 "만약"부분을 피하기 위해 몇 가지 방법이 생각, 어쩌면 또한 더 효율적이 잘 작동? 루프 앞에이 배열의 다른 뷰를 만든 다음이 뷰를 반복합니다. 이 처리하는

+0

중첩 된 for 루프가 피하고 싶은 것을 의미합니까? 나는 단순한 ... elif 구조 만 볼 수있다. –

+0

나는'if'를 중첩하지 않고 선택적으로'for'를 피하는 것을 의미합니다. @BiRico의 대답에 따르면,'numpy.rollaxis'는 나를 괴롭히는 "변수 차원"문제를 제거하는 한 가지 방법입니다. – dolphin

답변

3

한 일반적인 방법은 np.rollaxis을 사용하는 것입니다 : 실제로 배열을 복사하지 않도록 np.rollaxis보기를 반환해야 함을

def myfun(arr4d, selected_dim): # selected_dim can only be 2 or 3 
    arr4d = np.rollaxis(arr4d, selected_dim) 
    print arr4d.shape # (10, 2, 5, 10) 
    for i in xrange(arr4d.shape[1]): 
     for j in xrange(arr4d.shape[2]): 
      for k in xrange(arr4d.shape[0]): 
       arr=arr4d[k, i, j, :] 
       do_something(arr) # arr is 1-D and has 10 items 

참고.

+0

감사! 'np.take'를 적절한'axis'와 함께 사용하는 것이 가능하고, 아마도 다른 인자들도 비슷한 효과를 내기 위해서 가능한가요? 나는 그것을 할 수 없었지만,'take'도 유용 할 수 있습니다. – dolphin