【问题标题】:matrix manipulation - why is a normal loop producing different results?矩阵操作 - 为什么正常循环会产生不同的结果?
【发布时间】:2021-04-15 21:41:02
【问题描述】:

我的问题与this question 有关。我试图将@shuttle87 在他/她对the question 的回答中提供的列表理解建模为常规的老式循环。这是我的代码 sn-p 的样子:

matrix = [[2,0,2],[0,2,0],[2,0,2]]
sqd = []
for i in matrix:
    for e in i:
        sqd.append(e*e)
print(sqd)

我的问题是我的代码返回了一个列表,即[4, 0, 4, 0, 4, 0, 4, 0, 4],而不是一个矩阵,即[[4, 0, 4], [0, 4, 0], [4, 0, 4]]。我可能做错了什么?

免责声明:我知道有一些很棒的 python 库可以做到这一点,例如 numpy。我喜欢通过直觉来理解事物,因此这个问题......所以请原谅我的天真。

【问题讨论】:

    标签: python loops matrix list-comprehension


    【解决方案1】:

    您有一个列表sqd,您将向其附加标量值,因此它始终只是一个一维列表。如果您想要一个列表列表(即二维矩阵),您需要将列表附加到sqd,而不是标量值:

    matrix = [[2,0,2],[0,2,0],[2,0,2]]
    sqd = []
    for i in matrix:
        row = []  # create a new list for each row
        for e in i:
            row.append(e*e)  # append scalar to the row list
        sqd.append(row)  # append row to matrix list
    print(sqd)
    

    【讨论】:

    • 谢谢@Woodford。一时间,我不知所措。
    【解决方案2】:

    这里有两个 for 循环。您的外部循环正在遍历矩阵的列。

    您的内部循环正在遍历行。

    您的内部循环会贯穿整个循环,然后再进入下一列。

    现在您了解了该流程,您需要看到您的列表“sqd”只有一个正在执行的操作。附加操作将发生在内循环的每个循环中。您通过添加最新操作来扩展该列表的每个循环。

    要创建您希望看到的矩阵,您需要在内部循环和外部循环之间进行更多工作。 我建议为您的外循环的每次迭代制作一个新列表。这个新列表将被内部循环附加,一旦内部循环完成,您可以将这个新临时列表添加到“sqd”。

    【讨论】:

      【解决方案3】:

      因为您将 numbers 附加到 sqd 内部 for e in i 循环内。相反,您需要将这些数字附加到临时列表中,然后将 该列表 附加到 sqd

      matrix = [[2,0,2],[0,2,0],[2,0,2]]
      sqd = []
      for i in matrix:
          row = []
          for e in i:
              row.append(e*e)
          sqd.append(row)
      print(sqd)
      

      或者,作为一个列表理解:

      matrix = [[2,0,2],[0,2,0],[2,0,2]]
      sqd = [[e * e for e in row] for row in matrix]
      print(sqd)
      

      【讨论】:

      • 谢谢@Pranav
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多