gpt4 book ai didi

python - 逆时针旋转矩阵也会改变原始矩阵

转载 作者:太空宇宙 更新时间:2023-11-04 00:08:35 25 4
gpt4 key购买 nike

所以我目前有一个逆时针旋转矩阵的函数,列表总是一个正方形网格:

def rotate(m: List[List[int]]) -> None:
temp = m.copy()

if len(m) > 1:
for x in range(len(m)):
for y in range(len(m)):
temp[len(m)-1-y][x] = m[x][y]

m = temp.copy()

我已经反复跟踪这个函数,据我所知它应该可以工作。问题是出于某种原因,对 temp 的每次更改都会影响原始列表。例如,

ORIGINAL =

[[1, 2, 3],

[4, 5, 6],

[7, 8, 9]]

WHAT SHOULD OUTPUT =

[[3, 6, 9],

[2, 5, 8],

[1, 4, 7]]

WHAT ACTUALLY OUTPUTS =

[[3, 6, 1],

[2, 5, 2],

[1, 2, 1]

我使用的是 python ver 3.7.0,我也尝试过滑动而不是复制字符串,但同样的事情发生了。有人知道为什么吗?

最佳答案

由于 m 列表中的每个项目都是对子列表的引用,当您通过调用 m.copy() 制作 m 列表的副本时,它只是复制子列表的引用而不创建子列表的新副本,这就是为什么对 temp 列表的每次更改都会反射(reflect)在原始 m 列表。

您也应该使用 copy.deepcopy() 来制作子列表的副本:

from copy import deepcopy
def rotate(m):
temp = deepcopy(m)
if len(m) > 1:
for x in range(len(m)):
for y in range(len(m)):
temp[len(m)-1-y][x] = m[x][y]
return temp

这样:

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

返回:

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

或者,您可以通过压缩列表列表并将其反转来实现相同的矩阵旋转:

def rotate(m):
return list(zip(*m))[::-1]

关于python - 逆时针旋转矩阵也会改变原始矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53271464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com