【问题标题】:Numpy: rotate sub matrix m of MNumpy:旋转 M 的子矩阵 m
【发布时间】:2017-03-07 04:48:07
【问题描述】:

如果我知道每个方子矩阵 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)

等等

【问题讨论】:

    标签: python numpy matrix


    【解决方案1】:

    这是一种使用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)
    

    【讨论】:

    • 我发现很难将其应用于其他角度,例如 180、270 等。
    • @user1658296 似乎有一个错误。应该在刚刚完成的编辑中修复。
    • 谢谢,这很好,但是,我正在努力看看这可能如何推广到 m == 3x3 或 11x11,而不仅仅是 2x2。必须在这里计算转置轴变得非常棘手。
    • @user1658296 我认为您只需将reshape(m//2,2,n//2,2) 中的所有 2 更改为这些新数字即可。
    猜你喜欢
    • 2021-10-28
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 2020-04-28
    相关资源
    最近更新 更多