我正在使用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]]]) )
我甚至接近正确,我怎样才能纠正我所犯的大量失败?非常感谢提前
答案 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]