2016-07-14 13 views
1

3x5x5 "行列"(実際には3D numpy.ndarray)があります。私は実行する必要がある計算のために、私は最初のように、この3次元配列の各サブアレイを逆にする必要があります。あなたが見ることができるように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

関連する問題