添加矩阵时出错

时间:2017-11-10 16:08:10

标签: python python-2.7 math matrix

我有一个编码超过2个矩阵之和的赋值。我将它编码为2个矩阵并且它有效,但是当我为2个以上的矩阵编写相同的代码时,它不起作用。

这是2的代码:

def add_matrices(mat1,mat2):
    new_mat=[]
    m=0
    while m<len(mat1):
        c=[]
        n=0
        while n<len(mat1[0]):
            c.append(mat1[m][n]+mat2[m][n])
            n=n+1
        m=m+1
        new_mat.append(c)
    return new_mat

这是超过2的代码:

def sum_matrices(mat_lst):
    new_mat=[]
    for l in mat_lst:
        m=0
        while m<len(l):
            c=[]
            n=0
            while n<len(l[0]):
                c.append(sum(l[m][n]))
                n=n+1
        m=m+1        
        new_mat.append(c)
    return new_mat

当我尝试它时,它会回信:

 c.append(sum(l[m][n]))
TypeError: 'int' object is not iterable

我该如何解决?

2 个答案:

答案 0 :(得分:2)

这是因为sum是列表的函数waitng作为参数,而不是整数:

sum(1)
Traceback (most recent call last):
  File "python", line 1, in <module>
TypeError: 'int' object is not iterable

在您的第l[m][n]行 - &gt;那可能是int而不是list

sum(l[m])

将对位置m

中的列表求和

小心,你不能这样做:

sum([[1,2,3], [1,2]])
Traceback (most recent call last):
  File "python", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'list'

但你可以这样做:

sum([[1,2,3], [1,2]][0])
=> 6

答案 1 :(得分:1)

在你的代码中写道:

for l in mat_lst:

这意味着l是您想要求和的特定矩阵。接下来,您会生成一些坐标mn,然后编写sum(l[m][n])。但l[m][n]是矩阵的一个元素。因此,您在单个值上构建了sum(..)。现在sum(3)毫无意义(绝对不是你想要的)。

所以你必须以另一种方式进行处理。解决此问题的一种方法是首先迭代坐标对,然后在 all 矩阵中求和这些单元格。这意味着我们会写下这样的内容:

def sum_matrices(mat_lst):
    new_mat = []
    for m in range(len(mat_lst[0])):
        row = []
        for n in range(len(mat_lst[0][0])):
            row.append(sum(mat[m][n] for mat in mat_list))
        new_mat.append(row)
    return new_mat

此代码的工作原理如下。我们首先初始化new_mat = []:我们构造一个新的列表,它将成为结果。接下来,我们使用len(mat_list[0])确定第一个矩阵的行数。然后我们将使用for m in range(..)迭代所有行。因此m将从0开始,然后继续递增,直至达到len(mat_lst[0])。所以我们遍历所有行索引。我们这样做是为了迭代所有列索引n

然后,对于每个行/列索引对,我们将计算sum(mat[m][n] for mat in mat_list)。因此,我们为sum中的所有矩阵mat[m][n]计算mat mat_list。然后将该总和存储在我们正在构建的行中,并最终将该行添加到result

但我们也可以在这里使用嵌套列表理解:

def sum_matrices(mat_lst):
    return [ [ sum(cells) for cells in zip(*rows) ] for rows in zip(*mat_lst)]