如何在Python 3.3.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]) 我是否已经接近正确,我该如何纠正我所犯下的一大堆错误呢如何在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],
非常感谢当我手工找到矩阵的轨迹时,我先看左上角,然后将其添加到第二行的第二个元素,然后再添加到第三行的第三个元素,依此类推。这将引导我们走到这一步。这可能是编程逻辑灵感的一个很好的来源——如果你能用手工算法完成,你就可以编程了 简言之,我认为你想得太多了。这里有两个选项,假设列表列表,如您的示例所示
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]