Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy:旋转m的子矩阵m_Python_Numpy_Matrix - Fatal编程技术网

Python Numpy:旋转m的子矩阵m

Python Numpy:旋转m的子矩阵m,python,numpy,matrix,Python,Numpy,Matrix,如果我知道每个方子矩阵m(2x2)的维数,并且一个大方阵m的维数可以被维数m整除:m模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.],

如果我知道每个方子矩阵m(2x2)的维数,并且一个大方阵m的维数可以被维数m整除:m模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)
等等。

这里有一种使用和的方法-

样本运行-

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]])
如果必须使用,它只在前两个轴上工作,我们需要使用
转置
两次,就像这样-

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)

我发现将其应用于其他角度非常困难,例如180、270等@user1658296似乎有一个bug。应该在刚刚完成的编辑中修复。谢谢,这很好,但是,我正在努力了解这如何适用于m==3x3或11x11,而不仅仅是2x2。必须在这里计算转置轴会变得相当棘手。@user1658296我认为您只需要将
restrape(m//2,2,n//2,2)
中的所有2更改为这些新数字。
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)