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

时间:2018-12-22 12:28:31

标签: 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

如果我是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)

输入矩阵为

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

预期结果是:

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

结果是:

[7, 4, 1]
[2, 5, 2]
[1, 2, 1]

6 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

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)

输出

7 4 1
8 5 2
9 6 3

for col in zip(*matrix)获取矩阵的列,一旦有了列,您需要使用list(reversed(col))将其反转,然后使用list comprehension将所有列放在一起:

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

上面的列表理解等同于以下更少的 pythonic for循环:

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

进一步

  1. 关于zipreversedlist的文档。
  2. 符号*matrix被称为元组解包,更多here

答案 1 :(得分:2)

在非常简单的python中,此代码有效:

def rotate_matrix(a):
    b = []
    i = len(a)-1
    while i>=0:
        for j in range(0, len(a)):
            if (len(b) < (j+1)):
                b.append([a[i][j]])
            else:
                b[j].append(a[i][j])
        i -= 1
    return b

我打印了b。看起来像这样: [[7, 4, 1], [8, 5, 2], [9, 6, 3]]

答案 2 :(得分:1)

numpy.rot90也可以派上用场:

import numpy as np

a = [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]]
a_rot = np.rot90(a, k=3).tolist()
for row in a_rot:
  print(row)

输出

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

答案 3 :(得分:1)

您可以为此使用numpy rot90函数:np.rot90

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

k-表示转数
轴-指示旋转方向

输出

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

您代码中的问题

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

new_matrix = matrix

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

import copy

def rotate_clock(matrix):
    new_matrix = copy.deepcopy(matrix)

OR

def rotate_clock(matrix):
    new_matrix = [row[:] for row in matrix]

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

答案 4 :(得分:1)

一种旋转Matrix的通用方法,与形状无关。

import numpy as np
A=np.array([[1, 2, 3, 33], [4, 5, 6, 66], [7, 8, 9, 99]])
A
array([[ 1,  2,  3, 33],
       [ 4,  5,  6, 66],
       [ 7,  8,  9, 99]])

rotated_A=np.zeros((len(A[0]),len(A)))
for i in range(len(A)):
    for j in range(len(A[0])):
        rotated_A[j][len(A)-1-i]=A[i][j]
rotated_A
array([[  7.,   4.,   1.],
       [  8.,   5.,   2.],
       [  9.,   6.,   3.],
       [ 99.,  66.,  33.]])

答案 5 :(得分:0)

旋转任何矩阵的简单解决方案是

import copy
def rotateImage(a):
 out = copy.deepcopy(a)
 x = 0;
 y = 0;
 for i in a:
  l = len(i)
  for j in i:
   out[y][x+l-1] = j
   y += 1
   if(y == l):
    y=0
  x -= 1
 return(out)