数组就地旋转器返回错误的值

问题描述 投票:0回答:2

我希望定义一个函数来将矩阵旋转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]
]

而且我不确定为什么。

python algorithm array-algorithms
2个回答
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以指定应实现顺时针旋转的逆时针旋转量。


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

© www.soinside.com 2019 - 2024. All rights reserved.