【问题标题】:Printed stdout shows that array has been modified, but output shows it has not been modified打印的 stdout 显示数组已被修改,但输出显示它尚未被修改
【发布时间】:2021-10-31 20:29:02
【问题描述】:

我正在尝试解决 LeetCode 问题“旋转图像”,其中 2D int 数组顺时针旋转 90 度(visual representation)。 我找到了一个可行的解决方案,但是当我尝试重新分配名为“矩阵”的二维整数数组时,没有任何修改。我添加了一个打印语句,该语句在标准输出中演示了在某些时候矩阵正在被修改,但是程序输出与标准输出不匹配。即使我硬编码了正确的答案(就像我在注释掉的行中所做的那样),输出总是与输入匹配。

谁能解释一下这里到底发生了什么?

代码:

import numpy as np

    class Solution:
        def rotate(self, matrix: List[List[int]]) -> None:
            matrix = [np.asarray(col[::-1]) for col in zip(*matrix)]
            # matrix = [[7,4,1],[8,5,2],[9,6,3]]
            for col in matrix:
                print(col)

输入:

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

标准输出:

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

输出:

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

预期:

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

【问题讨论】:

  • 您没有返回矩阵并且您所做的更改没有到位。
  • 我明白了,我原本打算在原地进行更改而不是返回。您能否详细说明为什么将矩阵分配给[np.asarray(col[::-1]) for col in zip(*matrix)] 会产生与原地修改矩阵不同的结果?
  • matrix 作用域为函数最初是指传入的列表,但随后您将其替换为对您通过理解创建的列表的引用。您实际上并没有更改传递给函数的列表。您可以更改列表,但最好返回新列表(并使用例如mat = replace(mat) 调用它)

标签: python arrays


【解决方案1】:

我认为您将不得不发布更多代码,因为您尝试做的核心工作是:

import numpy as np

def rotate(matrix):
    matrix = [np.asarray(col[::-1]) for col in zip(*matrix)]
    # matrix = [[7,4,1],[8,5,2],[9,6,3]]
    print(matrix)

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

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

【讨论】:

    【解决方案2】:

    你快到了。您代码中的np.asarray 放错了位置。

    import numpy as np
    
    
    def rotate(matrix):
        matrix = np.array([col[::-1] for col in zip(*matrix)])
        print(matrix)
    

    让我们尝试旋转一些矩阵。

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

    旋转四乘四矩阵。

    >>> rotate([[ 1,  2,  3,  4],
    ...         [ 5,  6,  7,  8],
    ...         [ 9, 10, 11, 12],
    ...         [13, 14, 15, 16]])
    [[13  9  5  1]
     [14 10  6  2]
     [15 11  7  3]
     [16 12  8  4]]
    

    另外,我理解您认为您的代码不起作用的原因。

    当我们遍历一个数组时,我们从每次迭代中获取行,而不是列。所以你应该这样解释。

    for row in matrix:
        print(row)
    

    而不是下面的。

    for col in matrix:
        print(col)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-25
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 2017-02-03
      • 1970-01-01
      • 2018-01-15
      相关资源
      最近更新 更多