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

时间:2018-11-12 20:33:39

标签: python python-3.x

我正在尝试将矩阵逆时针旋转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度的简单方法?

3 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

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]将其迭代成一个列表并反转它。

答案 1 :(得分:0)

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

B i j = A j i

如果您旋转元素 ,这意味着如果旋转 n×m -matrix,则意味着:

B i j = A j n-i

因此我们可以将其计算为:

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]])

答案 2 :(得分:0)

其他选择是使用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. Nested List的行和列进行转置,然后使用[::-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]])