繁体   English   中英

如何将矩阵(嵌套列表)逆时针旋转90度

[英]How to rotate a matrix (nested list) counter clockwise by 90 degrees

我试图将矩阵逆时针旋转90度。 例如,如果:

m = [[1,2,3],
     [2,3,3],
     [5,4,3]]

那么结果应该是

m = [[3,3,3],
     [2,3,4],
     [1,2,5]]

到目前为止,我发现:

rez = [[m[j][i] for j in range(len(m))] for i in range(len(m[0]))]
    for row in rez:
        print(row)

这给了我

[1, 2, 5]
[2, 3, 4]
[3, 3, 3]

这很接近,但行需要反转。 有没有人知道一种简单的方法将这个矩阵逆时针旋转90度?

您可以执行以下操作:

m = [[1, 2, 3],
     [2, 3, 3],
     [5, 4, 3]]

result = list(map(list, zip(*m)))[::-1]

print(result)

产量

[[3, 3, 3],
 [2, 3, 4],
 [1, 2, 5]]

使用map(list, zip(*m))您可以创建列的可迭代,并使用表达式list(...)[::-1]将该iterable转换为列表并将其反转。

你在这里基本上做的是将矩阵A映射到矩阵B,这样:

B ij = A ji

如果你旋转元素,这意味着如果你旋转一个n×m矩阵,那意味着:

B ij = A j ni

所以我们可以将其计算为:

rez = [[m[j][ni] for j in range(len(m))] for ni in range(len(m[0])-1, -1, -1)]

这是转置,但比“逆转”。 然而,使用索引通常不是如何在Python中进行此类处理,因为现在它仅适用于可订阅的项目,因此我建议您寻找更优雅的解决方案。

但话虽如此,numpy提供了一个numpy.rot90函数来旋转矩阵:

>>> np.rot90(m)
array([[3, 3, 3],
       [2, 3, 4],
       [1, 2, 5]])

其他选项是使用scipy.ndimage.rotate

旋转一个数组。

使用所请求顺序的样条插值,在由轴参数给出的两个轴定义的平面中旋转阵列。

import numpy as np
from  scipy import ndimage

m = np.matrix([[1,2,3],
               [2,3,3],
               [5,4,3]])

ndimage.rotate(m, 90.0) #angle as float.
 Out: array([[3, 3, 3], [2, 3, 4], [1, 2, 5]]) 

通过使用zip()函数转置5.1.4的行和列,可以获得相同的结果 嵌套列表然后使用[::-1] +放入np.matrix中反转嵌套列表:

matrix = [[1, 2, 3],
          [2, 3, 3],
          [5, 4, 3]]

np.matrix(list(zip(*matrix)))[::-1]
 Out: matrix([[3, 3, 3], [2, 3, 4], [1, 2, 5]]) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM