Numpy:旋转M的子矩阵m

时间:2016-10-25 08:19:13

标签: python numpy matrix

如果我知道每个方形子矩阵m(2x2)的维数,并且大方矩阵M的维数可以被维数m整除:M modulo m == 0.

是否有一种有效的方法可以在以下矩阵M中旋转子矩阵:

M = array([[ 1.,  2.,  1.,  2.],
           [ 3.,  4.,  3.,  4.],
           [ 1.,  2.,  1.,  2.],
           [ 3.,  4.,  3.,  4.]])

结果如下:

M* = array([[ 2.,  4.,  2.,  4.],
            [ 1.,  3.,  1.,  3.],
            [ 2.,  4.,  2.,  4.],
            [ 1.,  3.,  1.,  3.]])

特别是强制使用像numpy.rot90()这样的函数会很有用,这样可以实现其他旋转,例如

180: rot90(x, 2)
270: rot90(x, 3)

1 个答案:

答案 0 :(得分:2)

以下是使用reshapetranspose -

的方法
m,n = M.shape
out = M.reshape(m//2,2,n//2,2)[...,::-1].transpose(0,3,2,1).reshape(m,n)

示例运行 -

In [246]: M
Out[246]: 
array([[51, 70, 59, 38, 84, 18],
       [80, 25, 76, 43, 80, 48],
       [92, 98, 46, 14, 65, 47],
       [73, 31, 32, 79, 87, 70]])

In [247]: m,n = M.shape

In [248]: M.reshape(m//2,2,n//2,2)[...,::-1].transpose(0,3,2,1).reshape(m,n)
Out[248]: 
array([[70, 25, 38, 43, 18, 48],
       [51, 80, 59, 76, 84, 80],
       [98, 31, 14, 79, 47, 70],
       [92, 73, 46, 32, 65, 87]])

如果你必须使用仅适用于前两个轴的np.rot90,我们需要使用transpose两次,就像这样 -

rot_arr = np.rot90(M.reshape(m//2,2,n//2,2).transpose(1,3,0,2),1)
out = rot_arr.transpose(2,0,3,1).reshape(m,n)