【问题标题】:Matrix addition in python [duplicate]python中的矩阵加法[重复]
【发布时间】:2020-08-29 09:40:04
【问题描述】:

我正在尝试编写将返回两个矩阵(嵌套列表)之和的简单函数。我不明白为什么下面的代码不能按预期工作。请注意,所有打印的步骤都很好,但最后的结果却不是。

代码:

matrix_a = [[1, 2, 4], [0, 1, 3], [2, 2, 8]]
matrix_b = [[0, 3, 1], [5, 4, 2], [8, 2, 6]]

rows = len(matrix_a)
columns = len(matrix_a[0])
result = [[0] * columns] * rows
for x in range(rows):
 for y in range(columns):
   result[x][y] = matrix_a[x][y] + matrix_b[x][y]
   print(f'[{x}][{y}]: {matrix_a[x][y]} + {matrix_b[x][y]} = {result[x][y]}')
print(result)

输出:

[0][0]: 1 + 0 = 1
[0][1]: 2 + 3 = 5
[0][2]: 4 + 1 = 5
[1][0]: 0 + 5 = 5
[1][1]: 1 + 4 = 5
[1][2]: 3 + 2 = 5
[2][0]: 2 + 8 = 10
[2][1]: 2 + 2 = 4
[2][2]: 8 + 6 = 14
[[10, 4, 14], [10, 4, 14], [10, 4, 14]]

你能告诉我如何解决它吗?对我来说更重要的是,为什么最后一行被复制了三遍?

【问题讨论】:

  • 使用列表理解[[sum(y) for y in zip(*x)] for x in zip(matrix_a, matrix_b)]

标签: python list matrix nested-lists


【解决方案1】:

当您执行 [[0] * columns] * rows 时,您正在创建一个包含 3 个对同一列表的引用的列表。

相当于下面的代码:

a = [0, 0, 0]      # a = [0] * columns
result = [a, a, a] # result = [a] * rows

因此,当您执行result[0]result[1]result[2] 时,您实际上引用的底层内存与a 相同。由于它们都引用同一个对象,所以当您执行最后三行时

[2][0]: 2 + 8 = 10
[2][1]: 2 + 2 = 4
[2][2]: 8 + 6 = 14

您实际上是在修改同一个基础实体 a(在我们的例子中)。

如果您想以编程方式分配结果数组,那么您必须这样做

result = [[0] * columns for _ in range(rows)]

附录: 现在你可能会问为什么[0] * columns 没有表现出相同的行为,即。为什么你的整个结果数组的值不是14。这与 Python 管理底层内存的方式有关,与数据类型是否可简单复制(例如原语)以及数据类型是否不可变(例如元组 vs 列表)有很大关系.

【讨论】:

    【解决方案2】:

    问题在于您初始化结果的方式,

    [[0] * columns] * rows] # results in reference being same,

    上面发生的事情是您正在创建一个数组 [0, 0, 0] 并引用它 3 次。

    改成

    [[0] * columns] for _ in range(rows)]. # separate lists would be created.

    【讨论】:

      【解决方案3】:
      matrix_a = [[1, 2, 4], [0, 1, 3], [2, 2, 8]]
          matrix_b = [[0, 3, 1], [5, 4, 2], [8, 2, 6]]
          
          result = []
          for row in range(len(matrix_a)):
              x = []
              for col in range(len(matrix_a[row])):
                  summed_row_array = matrix_a[row][col] + matrix_b[row][col]
                  x.append(summed_row_array)
          
              result.append(x)
          
          
          print(result)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-05
        • 2013-03-15
        • 1970-01-01
        • 2014-02-09
        • 1970-01-01
        • 2017-09-06
        • 2021-05-25
        相关资源
        最近更新 更多