【问题标题】:How to add the diagonals of a matrix in Python 3.3.5如何在 Python 3.3.5 中添加矩阵的对角线
【发布时间】:2014-10-12 03:24:27
【问题描述】:

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

"编写一个函数 sumOfDiagonal,它有一个类型为列表的参数。列表是一个 4x4 二维 整数数组(4 行 4 列整数)。该函数返回整数的总和 从左上角到右下角的对角线位置。该函数应为列表返回 14 以下。您可以假设列表始终是 4x4 二维整数数组。 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]

返回(求和1)

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

返回(求和1)

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

返回 (summation1+summation2)

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

我是否已经接近正确了,我该如何纠正我所拥有的大量失败?

在此先感谢

【问题讨论】:

  • 你的第一行提到了numpy,但是你根本没有使用它。如果数组确实是numpy.array,那么得到对角线是微不足道的。如果是多行字符串,我建议将其转换为数组。列表列表中的对角线也不应该很难。

标签: python arrays numpy matrix diagonal


【解决方案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)) 是非pythonic,

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

【讨论】:

  • 由于参数必须是分配中定义的列表,所以我选择了第一个,它工作得很好!谢谢!!
【解决方案2】:

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

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

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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多