2016-12-19 31 views
1

私はnumpy行列 'mat'を持っています。これは888 * 100 * 100です。これは、100 x 100グリッドの888サンプルを表します。多次元numpy行列のローテーションとフリップ

マトリクスの各グリッドにの変換を適用したいとします。

一度に変換を実行する方法はあります私はmod_mat = np.rot90(マット)を試してみましたが、それは100 * 888 * 100

にディメンションを変更?または、各グリッドを繰り返し処理し、別々に変換する必要がありますか?ありがとう。

答えて

1

np.rot90は最初の2つのディメンションを回転するので、軸0と2を入れ替えて回転させて元に戻すことができます。 numpyは高度に最適化された低レベルのコードライブラリであるため、Pythonの反復処理はおそらく遅くなるため、通常は組み込み関数を使用する方が良いでしょう。

In[9]: import numpy as np 
In[10]: x = np.arange(3*2*2).reshape(3, 2, 2) 
In[11]: x 
Out[11]: 
array([[[ 0, 1], 
     [ 2, 3]], 

     [[ 4, 5], 
     [ 6, 7]], 

     [[ 8, 9], 
     [10, 11]]]) 
In[12]: np.rot90(x.swapaxes(0, 2)).swapaxes(0, 2) 
Out[12]: 
array([[[ 2, 0], 
     [ 3, 1]], 

     [[ 6, 4], 
     [ 7, 5]], 

     [[10, 8], 
     [11, 9]]]) 
0

ここで最後の軸transposeflipping/reversingを使ったアプローチだ -

mat.transpose(0,2,1)[...,::-1] 

ランタイムテスト -

In [10]: a = np.random.rand(888 , 200 , 200) # Input array 

In [11]: %timeit np.rot90(a.swapaxes(0, 2)).swapaxes(0, 2) # @Wolfram's soln 
100000 loops, best of 3: 3.87 µs per loop 

In [12]: %timeit a.transpose(0,2,1)[...,::-1] 
1000000 loops, best of 3: 940 ns per loop