2016-12-19 26 views
1

Ich habe eine numpy Matrix "mat", die 888 * 100 * 100 ist. Dies entspricht 888 Proben von 100 von 100 Gittern.Drehen und Spiegeln multidimensionaler numpy Matrizen

Ich möchte eine Transformation auf jedes Raster in der Matrix anwenden.

Ich versuchte mod_mat = np.rot90 (mat), aber es änderte sich die Dimension: 100 * 888 * 100

Gibt es eine Möglichkeit, die Transformationen in einem Rutsch durchzuführen? Oder muss ich über jedes Gitter iterieren und es separat transformieren? Vielen Dank.

Antwort

1

np.rot90 rotiert die ersten zwei Dimensionen, also können Sie die Achsen 0 und 2 vertauschen, drehen und tauschen, um zu erreichen, was Sie wollen. Die Python-Iteration wird wahrscheinlich langsamer sein, da numpy eine hoch optimierte Low-Level-Codebibliothek ist, weshalb es besser ist, Built-Ins zu verwenden.

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

Hier ist ein Ansatz mit transpose und flipping/reversing die letzte Achse -

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

Runtime Test -

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