2016-07-14 2 views
1

3x5x5 "행렬"(실제로는 3D numpy.ndarray)이 있습니다. 내가 수행해야 할 몇 가지 계산을 위해, 내가 처음으로, 그래서이 3D 배열의 각 부분 배열을 반대해야합니다 당신이 볼 수 있듯이NumPy에서 3D 행렬의 모든 부분 행렬 반전

>>> x = np.arange(75).reshape(3, 5, 5) 
>>> x 
array([[[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24]], 

     [[25, 26, 27, 28, 29], 
     [30, 31, 32, 33, 34], 
     [35, 36, 37, 38, 39], 
     [40, 41, 42, 43, 44], 
     [45, 46, 47, 48, 49]], 

     [[50, 51, 52, 53, 54], 
     [55, 56, 57, 58, 59], 
     [60, 61, 62, 63, 64], 
     [65, 66, 67, 68, 69], 
     [70, 71, 72, 73, 74]]]) 

>>> np.array([ np.rot90(k, 2) for k in x ]) 
array([[[ 24., 23., 22., 21., 20.], 
     [ 19., 18., 17., 16., 15.], 
     [ 14., 13., 12., 11., 10.], 
     [ 9., 8., 7., 6., 5.], 
     [ 4., 3., 2., 1., 0.]], 

     [[ 49., 48., 47., 46., 45.], 
     [ 44., 43., 42., 41., 40.], 
     [ 39., 38., 37., 36., 35.], 
     [ 34., 33., 32., 31., 30.], 
     [ 29., 28., 27., 26., 25.]], 

     [[ 74., 73., 72., 71., 70.], 
     [ 69., 68., 67., 66., 65.], 
     [ 64., 63., 62., 61., 60.], 
     [ 59., 58., 57., 56., 55.], 
     [ 54., 53., 52., 51., 50.]]]) 

, 나는 처음에 잘 작동하는 것 같았다 해결책을 발견했다 (np.rot90 사용). 그러나 더 큰 입력을 테스트 할 때이 방법은 특히 첫 번째 차원이 100을 초과하는 경우 대폭적으로 느려집니다.이 작업을 더 빠르고 효율적으로 수행 할 수있는 방법이 있습니까?

감사합니다.

답변

1

그냥 axes 1,2을 따라 반대로, 따라서 루프를 피하고 잘하면 성능 향상을 얻을 수 있습니다. 따라서 원하는 출력을 간단하게 얻을 수 있습니다 -

x[:,::-1,::-1] 
+0

거룩한 암소, 놀랍도록 간단하고 우아한 해결책은 무엇입니까! 내 표를 가져 가라. 고마워요! –

+0

그런데 어떻게 그런 해결책이 당신을 때리셨습니까? numpy의 색인 생성 기법에 대한 정보는 어디서 알게 되었습니까? 당신이 사용했던 가이드가 있습니까? 나는 정말로 그것을 바르게 평가할 것이다! –

+1

@ Shiva 글쎄, 지난 1 년 동안'numpy' 태그를 쫓아 왔고 여기서 석사 과정을 배우고 내가 할 수있는 것에 대답하려고 노력했습니다. 저에게 연습을 제공합니다 :) 당신은 비슷한 것을 할 수 있습니다. – Divakar