如何在Python 3.3.5中添加矩阵的对角线

如何在Python 3.3.5中添加矩阵的对角线,python,arrays,numpy,matrix,diagonal,Python,Arrays,Numpy,Matrix,Diagonal,我在用numpy。我的任务是: “编写一个函数sumOfDiagonal,该函数有一个list类型的参数。list是4x4二维的 整数数组(4行4列整数)。函数返回 从左上到右下的对角线位置。对于列表,函数应返回14 您可以假设列表始终是4x4二维整数数组。 4925 311106 7 2 5 1 8 81 4“ 我正在为这件事苦苦挣扎。我尝试了一些方法,但一无所获。起初我试着: def sumOfDiagonal(列表1:list): 返回(总和1) 打印(对角线的总和([[4,9,2,5],

我在用numpy。我的任务是:

“编写一个函数sumOfDiagonal,该函数有一个list类型的参数。list是4x4二维的 整数数组(4行4列整数)。函数返回 从左上到右下的对角线位置。对于列表,函数应返回14 您可以假设列表始终是4x4二维整数数组。 4925

311106

7 2 5 1

8 81 4“

我正在为这件事苦苦挣扎。我尝试了一些方法,但一无所获。起初我试着:

def sumOfDiagonal(列表1:list):

返回(总和1)

打印(对角线的总和([[4,9,2,5],[3,1,10,6],[7,2,5,1],[8,8,1,4])

因为我在另一个线程上看到,这应该是可以做到的,我想我可以将输入数组按单独的列表进行拆分,以获得一个有用的第一个开始,但是我遇到了一个错误,关于没有属性…我只是再次尝试,但是关于调用外部函数,我遇到了一个错误

然后我又朝另一个方向做了几次尝试。我现在得到的是:

def sumOfDiagonal(列表1:list):

返回(总和1)

打印(对角线的总和([[4,9,2,5],[3,1,10,6],[7,2,5,1],[8,8,1,4])

这显然是不起作用,但我有一些版本的这个没有语法错误之前,只有一个逻辑错误(它是输出44)

我想那有点像

def sumOfDiagonal(列表1:list):

返回值(总和1+总和2)

打印(对角线的总和([[4,9,2,5],[3,1,10,6],[7,2,5,1],[8,8,1,4])

我是否已经接近正确,我该如何纠正我所犯下的一大堆错误呢


非常感谢当我手工找到矩阵的轨迹时,我先看左上角,然后将其添加到第二行的第二个元素,然后再添加到第三行的第三个元素,依此类推。这将引导我们走到这一步。这可能是编程逻辑灵感的一个很好的来源——如果你能用手工算法完成,你就可以编程了

简言之,我认为你想得太多了。这里有两个选项,假设列表列表,如您的示例所示

def sumOfDiagonal(matrix):
    sum = 0
    for i in range(len(matrix)):
        sum += matrix[i][i]        #These are the diagonal elements
    return sum
或者,如果您想一次完成所有操作并发现
范围(len(x))
为非音速

def sumOfDiagonal2(matrix):
    return sum([matrix[i][i] for i,_ in enumerate(matrix)])

有很多方法可以做到这一点:

从多行字符串开始,可以在一行中进行解析、选择对角线和求和:

txt = """4 9 2 5
3 1 10 6
7 2 5 1
8 8 1 4"""
sum([int(x.split()[i]) for i,x in enumerate(txt.splitlines())])
或者分步骤:

通过拆分行获取列表列表

LOL = [[int(y) for y in x.split()] for x in txt.splitlines()]
# [[4, 9, 2, 5], [3, 1, 10, 6], [7, 2, 5, 1], [8, 8, 1, 4]]
求对角线的和

sum(v[i] for i,v in enumerate(lol))
# 14
如果这确实是一个
numpy
赋值,
genfromtxt
是一个从txt获取数组的便捷工具

X=np.genfromtxt(txt.splitlines())
#
array([[  4.,   9.,   2.,   5.],
       [  3.,   1.,  10.,   6.],
       [  7.,   2.,   5.,   1.],
       [  8.,   8.,   1.,   4.]])
数组有它自己的函数来获得对角线和和

X.diagonal().sum()
# 14.0
X.trace()
np.einsum('ii',X)
其他迭代:

s = 0
for i in range(4): 
    s += X[i,i]
    # s += lol[i][i]
或者,如果要在数组的两个维度上迭代:

s = 0
for i in range(4):
    for j in range(4):
        if i==j:   
            s += lol[i][j]

你的第一行提到了
numpy
,但是你根本就不使用它。如果数组确实是一个
numpy.array
,那么获取对角线就很简单了。如果是多行字符串,我建议将其转换为数组。列表列表的对角线也不难。因为参数必须是赋值中定义的列表,所以我使用了第一个参数,它工作得非常好!谢谢
X.diagonal().sum()
# 14.0
X.trace()
np.einsum('ii',X)
s = 0
for i in range(4): 
    s += X[i,i]
    # s += lol[i][i]
s = 0
for i in range(4):
    for j in range(4):
        if i==j:   
            s += lol[i][j]