2016-12-19 50 views
1

我有一个numpy矩阵'mat',它是888 * 100 * 100.这代表了100个100个网格的888个样本。多维numpy矩阵的旋转和翻转

我想在矩阵中应用一个转换到每个网格

我试图mod_mat = np.rot90(垫),但它改变了尺寸100 * 888 * 100

有一气呵成进行转换的方法吗?或者,是否需要遍历每个网格并分别进行转换?谢谢。

回答

1

np.rot90首先旋转两个维度,因此您可以交换轴0和2,旋转并换回以达到您想要的效果。 Python迭代可能会更慢,因为numpy是一个高度优化的低级代码库,所以通常使用内置插件更好。

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