代码之家  ›  专栏  ›  技术社区  ›  SDG

python中的图像旋转令人困惑

  •  0
  • SDG  · 技术社区  · 5 年前
    def rotate(self, matrix):
        n = len(matrix)
        for i in range(n):
            for j in range(i+1, n):
                matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
        for i in range(n):
            matrix[i].reverse()
        return matrix
    

    下面是Python中矩阵/图像旋转函数的代码。这适用于所有情况,我不知道为什么。有人能给我解释一下为什么会这样,因为我在网上似乎找不到一个简单的解决方案,这个解决方案也很简练。

    0 回复  |  直到 5 年前
        1
  •  3
  •   Selcuk    5 年前

    例如,如果从以下矩阵开始:

    [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]]
    

    首先 for 循环块,它基本上转换矩阵:

    [[1, 4, 7],
     [2, 5, 8],
     [3, 6, 9]]
    

    然后反转每行,使其顺时针旋转90度:

    [[7, 4, 1],
     [8, 5, 2],
     [9, 6, 3]]
    

    作为旁注,这将是一种更短(可能更快)的方法:

    def rotate(self, matrix):
        return list(zip(*reversed(matrix)))
    

    基本相同,但使用内置功能 zip 将矩阵和列表转换为简明的理解。它还可以旋转矩形矩阵。主要区别在于原始代码修改了函数参数( matrix )执行就地旋转,因此具有较低的空间复杂度。

    同样,也可以实现逆时针旋转:

    def rotate_ccw(self, matrix):
        return list(reversed(zip(*matrix)))