2016-12-15 1 views
1

나는 numpy 배열 (A)을 입력으로 사용하는 함수가 있습니다. 이 배열은 수학적 계산에 따라 2 차원 또는 3 차원 배열 일 수 있습니다. 배열이 2D 일 때를 제외하고는 임의의 숫자가 될 수있는 정수 m이 있습니다. m의 값은 항상 0이됩니다. A의 silce를 다른 함수에 전달하려고합니다. A는 3D 또는 2D가 될 수 있으므로 3D 스타일 슬라이싱을 시도했습니다. A는 2D2D numpy 배열에서 3D 스타일 슬라이싱 사용

IndexError: too many indices for array 

나는 그것이 MATLAB에서 일어나는처럼 A는, 2D의 경우 Fun2에하는 전체 2D 배열을 전달 할 때

def fun(A): 
    ... some code 
    ans = fun2(A[:,:,m]) #The value of m is 0 if A is 2D 

은 나에게 IndexError을 제공합니다. 파이썬으로 어떻게 할 수 있습니까? 내가 사용하는 파이썬 좋은 설정은 단순히 같은, 마지막 축을 따라 m 번째 인덱스를 슬라이스 한 후 우리는 3D을 할 수 np.atleast_3d를 사용하고 같은 2

+0

MATLAB 자동 끝에 치수를 연장

케이스

1) 2D 달린다. 'numpy'는 시작시 확장을 수행합니다 - 적어도 방송 할 때. 그러나 색인 생성 컨텍스트에서는 인덱스를 추가하지 않습니다. – hpaulj

답변

2

보인다 -

np.atleast_3d(A)[...,m] # Or np.atleast_3d(A)[:,:,m] 

여전히 어레이에 대한 뷰이므로 효율성이 떨어집니다!

In [160]: A = np.random.randint(11,99,(4,5)) 

In [161]: np.atleast_3d(A)[...,0] 
Out[161]: 
array([[13, 84, 38, 15, 26], 
     [64, 91, 29, 11, 48], 
     [25, 66, 77, 14, 87], 
     [59, 96, 98, 30, 88]]) 

In [162]: A 
Out[162]: 
array([[13, 84, 38, 15, 26], 
     [64, 91, 29, 11, 48], 
     [25, 66, 77, 14, 87], 
     [59, 96, 98, 30, 88]]) 

2) 3D : (순서 = F) 필요에 따라

In [163]: A = np.random.randint(11,99,(4,3,5)) 

In [164]: np.atleast_3d(A)[...,1] 
Out[164]: 
array([[34, 81, 66], 
     [56, 20, 25], 
     [45, 36, 64], 
     [82, 64, 31]]) 

In [165]: A[:,:,1] 
Out[165]: 
array([[34, 81, 66], 
     [56, 20, 25], 
     [45, 36, 64], 
     [82, 64, 31]]) 
+1

'atleast_3d'가 1D 배열에 어떤 영향을 미치는지 조심하십시오 - 모양 배열'(N,)'을'(1, N, 1)'로 변환합니다. 이것은 예상하지 못한 것일 수도 있습니다 – Eric

+1

@Eric Good point! 그럼 OP는 1D와 작동하지 않으며 입력으로 1D가있는 경우 예상 결과는 언급되지 않습니다. 우리가'np.atleast_3d'로하고있는 2D 데이터를 기대하기 위해 데이터를 전달해야하는 함수입니다. 그래서 우리는 우리도 괜찮을 것이라고 추측합니다! – Divakar

+0

'np.atleast3d'를 사용하면'A [:, : m]'또는'A [:, :, newaxis] [:, :, m]'을 수행할지 여부를 결정하는 논리를 숨길 수 있습니다. – hpaulj

관련 문제