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

5

我是一名有用的助手,可以为您翻译以下关于IT技术的内容。

我正在尝试将一个矩阵逆时针旋转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度吗?


这里不是旋转,而是转置 - Willem Van Onsem
你可以在这里使用 numpynp.rot90(m) - Willem Van Onsem
1
list(zip(*m))[::-1] - Warren Weckesser
3个回答

4
你可以按照以下步骤进行操作:
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]将其转换为列表并反转。

你如何将其改为顺时针而不是逆时针? - Julian Silvestri

0

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

Bi j=Aj i

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

Bi j=Aj n-i

因此我们可以计算出:

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

这是转置,但是比“反转”更复杂。在Python中,使用索引通常不是处理此类问题的最佳方式,因为它仅适用于可进行下标访问的项目,因此我建议您寻找更优雅的解决方案。

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

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

0

另一个选择是使用scipy.ndimage.rotate

旋转数组。

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

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()函数来转置嵌套列表的行和列,然后使用[::-1]反转嵌套列表并放入一个np.matrix中,从而得到相同的结果。该方法与5.1.4. 嵌套列表相关。
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]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接