在Python中,如何将矩阵逆时针旋转90度?

8
>>> def rotate_matrix( k: List[List[int]]):
    """
    For example, if I have:
    m = [[1,2,3],
         [2,3,3],
         [5,4,3]]
    rotate_matrix(m) should give me [[3,3,3],[2,3,4],[1,2,5]]. 
    """

编辑:最好不要使用numpy。


我已经在Python IDLE中尝试了这段代码,但不知何故,它输出的是原始矩阵而不是旋转后的矩阵。你能帮忙看看吗? - user10634718
我刚刚复制了答案中的代码并运行了一下,结果完美无缺。请检查你的代码是否正确打印了数组,比如:print( new_matrix )。 - DrM
12个回答

12

以下是不使用Numpy的纯Python代码实现逆时针矩阵旋转的一行代码:

new_matrix = [[m[j][i] for j in range(len(m))] for i in range(len(m[0])-1,-1,-1)]

如果你想在一个函数中实现这个功能,则

def rotate_matrix( m ):
    return [[m[j][i] for j in range(len(m))] for i in range(len(m[0])-1,-1,-1)]

无论如何,结果都是

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

是什么

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

另外,如果您想要常规的转置,那么简单的一行纯Python版本如下:

[[m[j][i] for j in range(len(m))] for i in range(len(m[0]))]

我已经在Python IDLE中尝试了这段代码,但不知何故,它输出的是原始矩阵而不是旋转后的矩阵。你能帮忙看看吗? - user10634718
我只是从这里复制了代码并运行它,它很完美。请检查您的代码是否正确打印了数组,参见 print(new_matrix)。 - DrM
1
这段代码很好,你能否解释一下其中的一行代码以便理解吗?谢谢。 - Vrushal Raut
1
@VrushalRaut 很好的问题,也许画一张图片(或两张)会有所帮助。我会尽量找时间研究一下。 - DrM
@DrM,您会如何更改代码以顺时针旋转矩阵? - Programming Noob

10
你可以使用numpy函数rot90。
import numpy as np
m = np.array([[1,2,3],
         [2,3,3],
         [5,4,3]])

def rotate_matrix(mat):
    return np.rot90(mat)

2
编辑:最好不要使用numpy。 - Roy Iacob

7

#解决方案1

print(list(list(x) for x in zip(*m))[::-1])

抱歉,我的能力范围不包括翻译。我只能用英文回答问题。
print([[x[i] for x in m] for i in range(len(m))][::-1])

#solution3

r = []
i = 0
for row in m:
  listToAdd = [item[i] for item in m]
  r.append(listToAdd)
  i +=1
print(r[::-1])

如果您可以使用元组而不是列表,则可以更简短:list(zip(*m))[::-1][*zip(*m)][::-1] - ggorlen
为什么要用 * 解包 m,然后再用 zip 打包回去? - radoslav006
@radoslav006 这基本上是旋转/枢轴操作。zip 的参数是不同的列表,zip 的输出是每个列表的第n个元素组合在一起。 - undefined

3
def rotate_90_degree_anticlckwise(matrix):
    new_matrix = []
    for i in range(len(matrix[0]), 0, -1):
        new_matrix.append(list(map(lambda x: x[i-1], matrix)))

    return new_matrix


def rotate_90_degree_clckwise(matrix):
    new_matrix = []
    for i in range(len(matrix[0])):
        li = list(map(lambda x: x[i], matrix))
        li.reverse()
        new_matrix.append(li)

    return new_matrix

def rotate_90_degree_clckwise_by_zip_method(matrix):
    return list(list(x)[::-1] for x in zip(*matrix))

1

看一下这段代码。这是使用scratch将任何矩阵旋转90度的方法。

[这是将矩阵旋转90度的代码][1]

    n = input("enter input:")
    l =[]

    while (n !=""):
    
        l.append(n.split(" "))
        n = input("enter input:")
        l1=[]
    for i in range(len(l[0])):
        l1.append([])
    for j in range (len(l1)):
        for p in range(len(l)):
           l1[j].append(l[p][-(j+1)])

    for s in l1:
         print(*s)
'''


  [1]: https://istack.dev59.com/c8jHC.webp

0
def rotated_array(array):
    new_array = np.zeros([array.shape[0], array.shape[1]])
    for i in range(array.shape[0]):
        for j in range(array.shape[1]):
            t = array.shape[0]-j-1          # To Start with last row and first column
            new_array[i, j] = array[t, i]
    return new_array

新数组的形状与原始输入数组的形状相同。如果新数组是原始输入数组旋转90度得到的,则这是不正确的。 - Wilf Rosenbaum

0

将矩阵逆时针旋转90度(原地操作)

def rotate(matrix):
    for i in range(len(matrix) - 1, -1, -1):
        for j in range(i):
            matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
    matrix.reverse()

原地顺时针旋转矩阵90度

def rotate(matrix):
    matrix.reverse()
    for i in range(len(matrix)):
        for j in range(i):
            matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]

0
您可以循环遍历原始矩阵并创建一个新的矩阵。这是我逆时针的方法,对于另一种方式也会类似。 这不需要它是一个正方形。
def left_rotate(mat):
    if not mat: return []
    colcount = len(mat[0])

    # Initialize empty lists
    new = [list() for _ in range(colcount)]
    # Go through the rows, append elements one by one
    for row in mat:
        for j in range(colcount):
            new[j].append(row[colcount - 1 - j])
    return new

例子:

>>> print(left_rotate([[1, 2], [3, 4], [5, 6]]))
[[2, 4, 6], [1, 3, 5]]

0

如果您正在使用方阵(行数等于列数),那么可以使用以下代码:

list(zip(*reversed(a))) # 90 degrees clockwise

list(zip(*reversed(a)))[::-1] # 90 degrees counter-clockwise

代码片段中有一个小错误,您需要删除 reversed,使其变为:list(zip(*a))[::-1] # 逆时针旋转90度 - craigpastro

0

只需将矩阵垂直翻转,然后将右上角三角形与左下角三角形交换

def rotate_matrix_ccw(mat):
    if mat is None:
        return None
    n = len(mat)
    if n == 1:
        return mat
    for i in range(n):
        if len(mat[i]) != n:
            raise Exception("Matrix must be square")
    # flip the matrix vertically
    for j in range(n // 2):
        for i in range(n):
            mat[i][j], mat[i][n - 1 - j] = mat[i][n - 1 - j], mat[i][j]
    # switch the upper-right triangle with the lower-left triangle
    for i in range(n):
        for j in range(i):
            mat[i][j], mat[j][i] = mat[j][i], mat[i][j]
    return mat

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