2016-01-05 20 views
5

私はサイズ(3,2,2,2,2)の5D配列 'a'を持っています。最後の2次元で5D配列を回転する

import numpy as np 
a = np.arange(48).reshape(3,2,2,2,2) 
a[0,0,0]: 
array([[0, 1], 
     [2, 3]]) 

私がしたいことは、この5D配列を180度回転させ、最後の2つの次元だけを位置を変更することなく回転させることです。だから、出力[0,0,0]は次のようになります。私は試してみました

out[0,0,0]: 
array([[3, 2], 
     [1, 0]]) 

何:

out = np.rot90(a, 2) 
out[0,0,0]: 
array([[40, 41], 
     [42, 43]]) 

rot90機能が明らかに配列全体を回転させます。

注:私は

答えて

2

np.rot90axes=(-2, -1)を渡し、最後の二つの軸を180度回転するには:

>>> a180 = np.rot90(a, 2, axes=(-2, -1)) 
>>> a180[0, 0, 0] 
array([[3, 2], 
     [1, 0]]) 

numpyののバージョンがあり、np.rot90axesパラメータを持っていない場合代替品です。

一つの方法は、インデックスを使用することです:

a180 = a[..., ::-1, ::-1] 

rot90は、したがって、あなたは、(軸を逆にする)移調する必要が回転し、移調したい、それを使用して、配列の最初二つの軸を反転させます再び。例:

np.rot90(a.T, 2).T 
+0

ありがとうございます。しかし、それはしなかった。 – Babak

1

可能であれば私が正しく質問を理解している場合、あなたはそうのように、に最後の二つの軸に沿った要素の配置を逆転できるループのために使用しないようにしたい -

a[:,:,::-1,::-1] 

あなたはまた沿っ要素を逆などのように、バック整形次に、2次元アレイが最終軸としての最後の二つの軸をマージに再形成することができる -

a.reshape(-1,np.prod(a.shape[-2:]))[:,::-1].reshape(a.shape) 

サンプル実行 -

In [141]: a[0][0] 
Out[141]: 
array([[57, 64, 69], 
     [41, 28, 89]]) 

In [142]: out1 = a[:,:,::-1,::-1] 

In [143]: out2 = a.reshape(-1,np.prod(a.shape[-2:]))[:,::-1].reshape(a.shape) 

In [144]: out1[0][0] 
Out[144]: 
array([[89, 28, 41], 
     [69, 64, 57]]) 

In [145]: out2[0][0] 
Out[145]: 
array([[89, 28, 41], 
     [69, 64, 57]])