阵列就地旋转器返回错误值

时间:2019-03-15 10:27:00

标签: python algorithm array-algorithms

我希望定义一个将矩阵旋转90度的函数

def rotate_matrix(matrix):
        for i in range(len(matrix)//2):
            for j in range(i, len(matrix)-i-1):
                matrix[~j][i], matrix[i][j], matrix[j][~i], matrix[~i][~j] = matrix[i][j], matrix[j][~i], matrix[~i][~j], matrix[~j][i]
        return matrix

插入时:

[
 [a, b],
 [c, d]
]

它返回:

[
 [b, d],
 [a, c]
]

代替:

[
 [c, a],
 [d, b]
]

我不确定为什么。

2 个答案:

答案 0 :(得分:0)

您在正确的轨道上!您的代码执行逆时针旋转而不是顺时针
要解决此问题,您必须对分配逻辑进行一些小的更改:

def rotate_matrix(matrix):
        for i in range(len(matrix)//2):
            for j in range(i, len(matrix)-i-1):
                matrix[~j][i], matrix[i][j], matrix[j][~i], matrix[~i][~j] = \
                matrix[~i][~j], matrix[~j][i], matrix[i][j], matrix[j][~i]
        return matrix

满足您的需求。


但是,我将使用 numpy ,因为它具有built in method用于旋转矩阵:

import numpy as np
mat = np.array([['a','b'],
         ['c','d']])

def rotate_matrix(matrix):
    return np.rot90(matrix, 3) // * SEE NOTE

print(rotate_matrix(mat))

返回:

[['c' 'a']
 ['d' 'b']]


注意:rot90方法提供逆时针旋转。由于您请求顺时针旋转,因此必须指定参数3以指定实现顺时针旋转应进行的逆时针旋转量。

答案 1 :(得分:0)

这是解决您问题的方法,您必须使用适当的赋值

尝试查看您正在做的作业,

就索引而言:(0,0)->(0,1),(0,1)->(1,1),(1,0)->(0,0)和 (1,1)->(1,0)这是错误的。

这就是为什么您得到错误的解决方案

您应该做的就是将索引匹配为

(0,0)->(0,1),(0,1)->(0,0),(1,1)->(0,1),(1,0) ->(1,1)

下面是正确的解决方案。

def rotate_matrix(matrix):
        for i in range(len(matrix)//2):
            for j in range(i, len(matrix)-i-1):
               matrix[i][j], matrix[~i][j], matrix[i][~j], matrix[~i][~j]= matrix[~i][j],matrix[i][~j],matrix[i][j],matrix[~i][~j]
        return matrix

a = [
 ['a','b'],
 ['c', 'd']
]

print(rotate_matrix(a))
# output [['c', 'a'], ['b', 'd']]

这是您要解决的问题的解决方案,即矩阵旋转 在90度     #Python程序旋转矩阵

# Function to rotate a matrix 
def rotateMatrix(mat): 

    if not len(mat): 
        return

    """ 
        top : starting row index 
        bottom : ending row index 
        left : starting column index 
        right : ending column index 
    """

    top = 0
    bottom = len(mat)-1

    left = 0
    right = len(mat[0])-1

    while left < right and top < bottom: 

        # Store the first element of next row, 
        # this element will replace first element of 
        # current row 
        prev = mat[top+1][left] 

        # Move elements of top row one step right 
        for i in range(left, right+1): 
            curr = mat[top][i] 
            mat[top][i] = prev 
            prev = curr 

        top += 1

        # Move elements of rightmost column one step downwards 
        for i in range(top, bottom+1): 
            curr = mat[i][right] 
            mat[i][right] = prev 
            prev = curr 

        right -= 1

        # Move elements of bottom row one step left 
        for i in range(right, left-1, -1): 
            curr = mat[bottom][i] 
            mat[bottom][i] = prev 
            prev = curr 

        bottom -= 1

        # Move elements of leftmost column one step upwards 
        for i in range(bottom, top-1, -1): 
            curr = mat[i][left] 
            mat[i][left] = prev 
            prev = curr 

        left += 1

    return mat 

# Utility Function 
def printMatrix(mat): 
    for row in mat: 
        print row 


# Test case 1 
matrix = [
 ['a','b'],
 ['c', 'd']
]



matrix = rotateMatrix(matrix) 
# Print modified matrix 
printMatrix(matrix) 

# output [['c', 'a'], ['b', 'd']]

ps geeksforgeets的第二个解决方案