使用python中的列表顺时针旋转矩阵90度

Hus*_*ain 3 python list matrix

我正在尝试在 python 中顺时针旋转 3*3 矩阵 90 度。我已经确定 [ i ][ j ] 处的元素转到 [ j ][ new_i ]。这里 new_i 依赖于前一个 i,所以我为它做了一个叫做循环减法的函数。

如果 i 是 0 那么 new_i 是 2

如果 i 是 1 那么 new_i 是 1

如果 i 是 2 那么 new_i 是 0

执行后,它给了我意想不到的结果。

我已经打印了每次迭代中发生的所有事情。我无法弄清楚某些元素是如何被不同的元素替换的。

'''
1 2 3                       7 4 1
4 5 6  rotate 90 degrees    8 5 2
7 8 9                       9 6 3


'''

def circular_subtraction(i):
    new_i = i 
    if(i==0):
        new_i = 2
    elif(i==1):
        new_i = 1
    elif(i==2):
        new_i = 0
    return new_i


def rotate_clock(matrix):
    new_matrix = matrix

for i in range(len(matrix)):
    for j in range(len(matrix)):
        new_i = circular_subtraction(i)
        new_matrix[j][new_i] = matrix[i][j]
        print("New element added from {},{} to {},{} ::: {} to {}".format(i+1,j+1,j+1,new_i+1,matrix[i][j],new_matrix[j][new_i]))

for each_row in new_matrix:
    print(each_row)




matrix = [[1,2,3],[4,5,6],[7,8,9]]
print("Length of the matrix : ",len(matrix))
for each_row in matrix:
    print(each_row)
print()
matrix = rotate_clock(matrix)
Run Code Online (Sandbox Code Playgroud)

输入矩阵是

[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

预期的结果是:

[7, 4, 1]
[8, 5, 2]
[9, 6, 3]
Run Code Online (Sandbox Code Playgroud)

结果是:

[7, 4, 1]
[2, 5, 2]
[1, 2, 1]
Run Code Online (Sandbox Code Playgroud)

Dan*_*ejo 8

你可以这样做:

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

rotated = [list(reversed(col)) for col in zip(*matrix)]

for row in rotated:
    print(*row)
Run Code Online (Sandbox Code Playgroud)

输出

7 4 1
8 5 2
9 6 3
Run Code Online (Sandbox Code Playgroud)

for col in zip(*matrix)得到矩阵的列,一旦你有列则需要使用反向它们list(reversed(col)),然后用一个列表理解放在一起:

rotated = [list(reversed(col)) for col in zip(*matrix)]
Run Code Online (Sandbox Code Playgroud)

上面的列表推导等价于下面的Pythonic for 循环:

rotated = []
for col in zip(*matrix):
    rotated.append(list(reversed(col)))
Run Code Online (Sandbox Code Playgroud)

更远

  1. 有关zipreversedlist 的文档。
  2. 该符号*matrix被称为元组解包,更多信息请点击此处


Ole*_*leg 5

您可以使用 numpy rot90 函数来实现此目的:np.rot90

mat = [[1, 2, 3], [4,5,6,], [7,8,9]]
np.rot90(mat, k=1, axes=(1,0))
Run Code Online (Sandbox Code Playgroud)

k - 表示旋转数
axis - 表示旋转方向

输出

array([[7, 4, 1],
   [8, 5, 2],
   [9, 6, 3]])
Run Code Online (Sandbox Code Playgroud)

您的代码中的问题

该代码缺少缩进(但假设它们是正确的)
行:

new_matrix = matrix
Run Code Online (Sandbox Code Playgroud)

为矩阵变量分配一个新的引用。
在 python 中,默认值不是按值复制。您可以使用深度复制功能:copy.deepcopy(x[, memo])

import copy

def rotate_clock(matrix):
    new_matrix = copy.deepcopy(matrix)
Run Code Online (Sandbox Code Playgroud)

或者

def rotate_clock(matrix):
    new_matrix = [row[:] for row in matrix]
Run Code Online (Sandbox Code Playgroud)

否则,您对 new_matrix 所做的每个更改也会在原始矩阵中完成。(因为 new_matrix 只是对矩阵的引用)