在python中使用列表创建标识矩阵时出错



我试图制作一个单位矩阵来寻找逆。但由于代码中的一个错误,我现在被卡住了。新鲜的眼光会有很大帮助。

identity=[]
null=[]
for i in range(3):
null.append(i*0)
for j in range(3):
identity.append(null)
for k in range(3):
identity[k][k]=1
print(identity)

结果我得到

[[1, 1, 1], [1, 1, 1], [1, 1, 1]]

我想要

[[1, 0, 0], [0, 1, 0], [0, 0, 1]]

代码的问题是identity没有3个不同的null列表,它有3个完全相同的null列表。这就是为什么在每次迭代中,您都要更改所有迭代的值。

例如,如果您简单地运行以下代码,您会发现不是最后一个For循环:

identity[1][1]=1
print(identity)

你会发现结果是

[[0, 1, 0], [0, 1, 0], [0, 1, 0]]

如果你想创建一个带有列表的单位矩阵,你可以做以下操作:在每个i次迭代中,你会附加一行,其中i次元素是1:

identity = []
for i in range(3):
row = [0]*3
row[i] = 1
identity.append(row)

作为一个函数:

def eye(size):
identity = []
for i in range(size+1):
row = [0]*(size+1)
row[i] = 1
identity.append(row)
return identity
eye(3)

输出:

[[1, 0, 0], [0, 1, 0], [0, 0, 1]]
identity = [[int(j == i) for j in range(n_rows)] for i in range(n_rows)]
派对迟到了,但是。。

关键是,当您运行第二个循环(for j in range(3):(时,您将追加三次名为null的对象。

当您运行第三个循环for k in range(3):时,您每次都在访问和修改同一个对象。

你可以检查我打印对象id:的意思

for k in range(3):
print(id(identity[k]))

解决方案只是附加对象的副本,将第二个循环更改为:

for j in range(3):
identity.append(null.copy()) # <-- added .copy()

在@enke-Answer上进行扩展,可以以模块化的形式进行扩展,创建任意行的标识矩阵。

def eye(num):
mat = []
for i in range(num+1):
row = [0]*(num+1)
row[i]=1
mat.append(row)
return mat

现在你可以轻松地进行

eye(5)
Out[2]: 
[[1, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0],
[0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1]]

您可以使用Numpy Library轻松创建

import numpy as np 
data = np.eye(rows, columns) 
[![# Let's do that: 
data = np.eye(5,5) 
print(data)][1]][1]

希望你能理解![1] :https://i.stack.imgur.com/wmKpe.png

a=int(输入(输入所需矩阵数::'((

lis = []

for i in range(a):
new = [0]*a
new[i] = 1
lis.append(new)
# Now you can add many identity matrix, Enjoy!

最新更新