1

采取以下列表

matrix1 = [[1, 1], [2, 3]]
matrix2 = [[1, 1], [2, 3]]

如何在不使用其他库(例如 pandas、numpy、...)的情况下返回各种列表列表的总和,在这种情况下为 2,如

[[2, 2], [4, 6]]

与以下

def addMatrix(m1, m2):

    if len(m1) == len(m2):
        return [x[0] + x[1] for x in zip(m1, m2)]
    else:
        raise ValueError("Given matrices are not the same size.")

它返回

>>> addMatrix(matrix1, matrix2)
[[1, 1, 1, 1], [2, 3, 2, 3]]

这不是人们想要的,并且只适用于列表,而不是列表列表。

一个人也尝试了以下方法,但给出与上面相同的输出

new = [] 

def add(m1, m2):
    for i, value in enumerate(m1):
        if len(m1) == len(m2):
            additional = m2[i]
            new.append(value + additional)
        else:
            raise ValueError("Given matrices are not the same size.")

人们知道如何使用 numpy 来实现,但是人们想要一种不使用任何库的方法。

这是一个使用 numpy 的工作解决方案

import numpy as np

matrix1_np = np.asarray(matrix1)
matrix2_np = np.asarray(matrix2)
add = matrix1_np + matrix2_np
add.tolist()
4

3 回答 3

5
[list(map(sum, zip(*i))) for i in zip(matrix1, matrix2)]

输出

[[2, 2], [4, 6]]
于 2021-01-25T19:20:31.130 回答
2

您可以使用和使用嵌套列表推导。例如:zip()sum()

>>> matrix1 = [[1, 2], [3, 4]]
>>> matrix2 = [[5, 6], [7, 8]]

>>> [[sum(y) for y in zip(*x)] for x in zip(matrix1, matrix2)]
[[6, 8], [10, 12]]
于 2021-01-25T19:25:59.573 回答
1

我注意到以前的答案中有一个模式。他们都使用zipand sum

可以处理超过 2 个列表的替代方法如下

def addMatrix(*matrices):
    return [
        [sum(values) for values in zip(*rows)]
        for rows in zip(*matrices)
    ]

如果我们以下面的矩阵为例

matrix1 = [[1, 1], [2, 3]]
matrix2 = [[1, 1], [2, 3]]
matrix3 = [[1, 1], [2, 3]]

并打印结果

>>> print(addMatrix(matrix1, matrix2, matrix3))
[[3, 3], [6, 9]]

zip确实,可以很方便地同时遍历两个列表。这是一种仅使用的方法zip

def addMatrix(matrix1, matrix2):
    return [
        [n + m for n, m in zip(row1, row2)]
        for row1, row2 in zip(matrix1, matrix2)
    ]

或者,在一行中

def addMatrix(matrix1, matrix2):
    return [[n+m for n, m in zip(r1, r2)] for r1, r2 in zip(matrix1, matrix2)]
于 2021-01-27T15:37:21.397 回答