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

时间:2014-10-12 03:24:27

标签: python arrays numpy matrix diagonal

我正在使用numpy。我的任务是:

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

3 1 10 6

7 2 5 1

8 8 1 4“

我正在努力解决这个问题。我尝试了几种方法,什么都没得到。起初我试过了:

def sumOfDiagonal(list1:list):

 summation1=[i.split(", ")[0] for i in list1]

return(summation1)

print(sumOfDiagonal([[4,9,2,5],[3,1,10,6],[7,2,5,1],[8,8,1,4]]]) )

因为我在另一个线程上看到,据说这可以完成,我认为我可以通过各个列表将输入数组拆分为有用的第一次启动,但是我得到一个关于没有属性的错误...我刚试了一次,我收到一个关于调用外部函数的错误

然后我在另一个方向做了几次其他尝试。我现在拥有的是:

def sumOfDiagonal(list1:list):

i=0
j=0
summation1=0
for row in list1:
    for i in row:

        for column in list1:
            for j in column:

                summation1=list1[i j],row[i]+summation1

return(summation1)

print(sumOfDiagonal([[4,9,2,5],[3,1,10,6],[7,2,5,1],[8,8,1,4]]]) )

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

我认为这就像是

def sumOfDiagonal(list1:list):

i=0
j=0
summation1=0
summation2=0
for row in list1:
    summation1=row[1]+summation1
    i+=i

for column in list1:
    summation2=column[i]+summation2
    i+=i

return(summation1 + summation2)

print(sumOfDiagonal([[4,9,2,5],[3,1,10,6],[7,2,5,1],[8,8,1,4]]]) )

我甚至接近正确,我怎样才能纠正我所犯的大量失败?

非常感谢提前

2 个答案:

答案 0 :(得分:1)

当我手工找到矩阵的迹线时,我首先查看左上角,然后将其添加到第二行中的第二个元素,然后添加到第三行中的第三个元素,依此类推。这将指导我们。这可以成为编程逻辑灵感的良好来源 - 如果您可以通过算法手动完成,则可以对其进行编程。

简而言之,我认为你是在思考它。这里有两个选项,假设列表列表,如您的示例所示。

def sumOfDiagonal(matrix):
    sum = 0
    for i in range(len(matrix)):
        sum += matrix[i][i]        #These are the diagonal elements
    return sum

或者,如果你想一次性完成所有操作并发现range(len(x))为unpythonic,

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

答案 1 :(得分:1)

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

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

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]