Python 矩阵中对角元素的和

Python 矩阵中对角元素的和,python,matrix,Python,Matrix,我试图找出矩阵中对角线元素的和。这里,n是平方矩阵的大小,a是矩阵。有人能给我解释一下这里发生了什么吗 n = 3 a = [[11,2,4],[4,5,6],[10,8,-12]] sum_first_diagonal = sum(a[i][i] for i in range(n)) sum_second_diagonal = sum(a[n-i-1][n-i-1] for i in range(n)) print(str(sum_first_diagonal)+" "+str(sum_fir

我试图找出矩阵中对角线元素的和。这里,n是平方矩阵的大小,a是矩阵。有人能给我解释一下这里发生了什么吗

n = 3
a = [[11,2,4],[4,5,6],[10,8,-12]]
sum_first_diagonal = sum(a[i][i] for i in range(n))
sum_second_diagonal = sum(a[n-i-1][n-i-1] for i in range(n))
print(str(sum_first_diagonal)+" "+str(sum_first_diagonal))

尝试将第二条对角线相加:

sum(a[i][n-i-1] for i in range(n))
内部循环访问以下条目:

>>> n = 3
>>> [(i, n-i-1) for i in range(n)]
[(0, 2), (1, 1), (2, 0)]
样本矩阵的对角线的总和为:

>>> n = 3
>>> sum(a[i][n-i-1] for i in range(n))
19
代码中的错误是对两个维度使用相同的表达式:

a[n-i-1][n-i-1]

它将以相反的顺序再次处理第一个对角线。[code>[(2,2),(1,1),(0,0)]给您两次相同的和。

使用numpy库,它对任何矩阵计算都很强大。针对您的具体情况:

import numpy as np
a = [[11,2,4],[4,5,6],[10,8,-12]]
b = np.asarray(a)
print('Diagonal (sum): ', np.trace(b))
print('Diagonal (elements): ', np.diagonal(b))
您可以通过pip或其他方式轻松安装numpy,这些方式可以在许多网站上找到

如果您想要所有的对角线,而不仅仅是主对角线,请检查是否也使用numpy

编辑

mhawke,如果要计算反对角线(第二对角线),如中所述,可以在numpy中翻转矩阵

import numpy as np
a = [[11,2,4],[4,5,6],[10,8,-12]]
b = np.asarray(a)
b = np.fliplr(b)
print('Antidiagonal (sum): ', np.trace(b))
print('Antidiagonal (elements): ', np.diagonal(b))
试试这个:

n=3
sum_second_diagonal=sum([a[i][j] for i in range(n) for j in range(n) if i==j]) #it will add when i==j

因为您知道行
i
的对角线元素的位置,所以可以非常密集地编写它,如下所示:

d = sum(row[i] + row[-1-i] for i, row in a)
而且,对于奇数大小的矩阵,不应添加两次中心元素:

if len(a)%2:
    centre = len(a)//2
    d -= a[centre][centre]

我找到了一个简单的算法来完成这项任务

  • 将方阵存储在单个一维数组中

  • def diagonalDifference(arr):
            # arr[0][0], arr[1][1], arr[2][2]
            # arr[0][2], arr[1][1], arr[2][0]
            sumOfDiagonalFromLeft = 0
            sumOfDiagonalFromRight = 0
            pointIndexFromLeft = 0
            pointIndexFromLast = len(arr)-1
            for i in range(len(arr)):
                sumOfDiagonalFromLeft += arr[i][pointIndexFromLeft]
                # print(arr[i][pointIndexFromLeft])
                pointIndexFromLeft += 1
            
            for i in range(len(arr)):
                sumOfDiagonalFromRight += arr[i][pointIndexFromLast]
                # print(arr[i][pointIndexFromLast])
                if pointIndexFromLast < 0:
                    break
                else:
                    pointIndexFromLast -= 1
        
            diagonalDifference = abs(sumOfDiagonalFromLeft - sumOfDiagonalFromRight)
            return diagonalDifference
        
    arr = [[11, 2, 4], [4, 5, 6], [10, 8, -12]]
    print(diagonalDifference(arr))
    
  • 设n为平方矩阵的阶

  • 有两条对角线,一条从最左边的元素开始,另一条从最左边的元素开始 另一个从顶行的第n个元素开始

  • 从包含矩阵中所有数字的数组中,获取从顶行最左侧元素开始的对角线上的数字索引;只需从索引1开始递归地添加(n+1)。 也就是说,数组中从左到右对角线的元素的索引是,1,1+(n+1),(n+2)+(n+1),(2n+3)+(n+1),直到数组的最后一个索引为止

  • 从包含矩阵中所有数字的数组中获取另一对角线数字的索引;只需将(n-1)递归地添加到索引中,从等于“n”的索引开始,这是平方矩阵的顺序。 也就是说,数组中从右到左对角线的元素的索引是,n,n+(n-1),(2n-1)+(n-1)等等,直到索引等于“数组的长度-(n-1)”

  • 如果顺序为奇数,则从最终和中减去数组中的中间数

  • 示例“c++代码”如下所示:

    #包括
    使用名称空间std;
    对角线数平方矩阵的整数和(整数数数组[],整数阶){
    int sumOfLeftToRightDiagonal=0;
    int sumofRightToLeftDigonal=0;
    整数长度=顺序*顺序;
    对于(inti=0;i,我不明白为什么没有人发布任何好的解决方案。
    以下是解决方案:


    这里arr是一个二维列表。

    从一个平方矩阵得到总和对角和

    squared_matrix = [[2,3,4],[4,3,3],[3,3,4]]
    s, ds = get_sum(squared_matrix)
    
    def get_sum(diag_mat):
        n = len(diag_mat)
        total = sum([diag_mat[i][j] for i in range(n) for j in range(j)]
        d_sum = sum([diag_mat[i][j] if i==j else 0 for i in range(n) for j in range(j)]
       return d_sum, total
    
    把你的名单传进来。 这应该适用于您:)

    O(n)时间解,以找到给定多维数组的对角线差

    def diagonalDifference(arr):
            # arr[0][0], arr[1][1], arr[2][2]
            # arr[0][2], arr[1][1], arr[2][0]
            sumOfDiagonalFromLeft = 0
            sumOfDiagonalFromRight = 0
            pointIndexFromLeft = 0
            pointIndexFromLast = len(arr)-1
            for i in range(len(arr)):
                sumOfDiagonalFromLeft += arr[i][pointIndexFromLeft]
                # print(arr[i][pointIndexFromLeft])
                pointIndexFromLeft += 1
            
            for i in range(len(arr)):
                sumOfDiagonalFromRight += arr[i][pointIndexFromLast]
                # print(arr[i][pointIndexFromLast])
                if pointIndexFromLast < 0:
                    break
                else:
                    pointIndexFromLast -= 1
        
            diagonalDifference = abs(sumOfDiagonalFromLeft - sumOfDiagonalFromRight)
            return diagonalDifference
        
    arr = [[11, 2, 4], [4, 5, 6], [10, 8, -12]]
    print(diagonalDifference(arr))
    
    def对角线差(arr):
    #arr[0][0],arr[1][1],arr[2][2]
    #arr[0][2],arr[1][1],arr[2][0]
    从左到右的对角线总和=0
    sumOfDiagonalFromRight=0
    pointIndexFromLeft=0
    pointIndexFromLast=len(arr)-1
    对于范围内的i(len(arr)):
    sumOfDiagonalFromLeft+=arr[i][pointIndexFromLeft]
    #打印(arr[i][pointIndexFromLeft])
    pointIndexFromLeft+=1
    对于范围内的i(len(arr)):
    对角线fromRight+=arr[i][pointIndexFromLast]
    #打印(arr[i][pointIndexFromLast])
    如果pointIndexFromLast<0:
    打破
    其他:
    pointIndexFromLast-=1
    对角线差值=绝对值(从左到右的对角线总和)
    返回对角线差
    arr=[[11,2,4],[4,5,6],[10,8,-12]]
    打印(对角线差(arr))
    
    ''

    ''' 这里有一个简单的方法。
    谢谢

    您将同一对角线求和两次,一次从左上到右下,然后从左上到右下。我不相信此代码片段可以在任何Python安装上打印除
    4
    以外的任何内容。我认为OP无法使用
    numpy
    ,因为他们正在将代码提交给一个不支持ot permit
    numpy
    。第二条对角线是如何计算的?请解释这是如何回答问题的,第二条对角线的总和也可以写成:
    squared_matrix = [[2,3,4],[4,3,3],[3,3,4]]
    s, ds = get_sum(squared_matrix)
    
    def get_sum(diag_mat):
        n = len(diag_mat)
        total = sum([diag_mat[i][j] for i in range(n) for j in range(j)]
        d_sum = sum([diag_mat[i][j] if i==j else 0 for i in range(n) for j in range(j)]
       return d_sum, total
    
    def sum_up_diagonals(li):
    index = len(li)
    first_dia =  sum(li[i][i]for i in range(index))
    second_dia = sum(li[i][index-i-1]for i in range(index))
    return (first_dia,second_dia)
    
    def diagonalDifference(arr):
            # arr[0][0], arr[1][1], arr[2][2]
            # arr[0][2], arr[1][1], arr[2][0]
            sumOfDiagonalFromLeft = 0
            sumOfDiagonalFromRight = 0
            pointIndexFromLeft = 0
            pointIndexFromLast = len(arr)-1
            for i in range(len(arr)):
                sumOfDiagonalFromLeft += arr[i][pointIndexFromLeft]
                # print(arr[i][pointIndexFromLeft])
                pointIndexFromLeft += 1
            
            for i in range(len(arr)):
                sumOfDiagonalFromRight += arr[i][pointIndexFromLast]
                # print(arr[i][pointIndexFromLast])
                if pointIndexFromLast < 0:
                    break
                else:
                    pointIndexFromLast -= 1
        
            diagonalDifference = abs(sumOfDiagonalFromLeft - sumOfDiagonalFromRight)
            return diagonalDifference
        
    arr = [[11, 2, 4], [4, 5, 6], [10, 8, -12]]
    print(diagonalDifference(arr))
    
    a = [[],[],[]] #your matrix
    s = 0
    for i in range(len(a)):
        for j in range(len(a[0])):
               if i == j:
                   s += a[i][j]
    print('sum ='s)