使用 python 中的列表创建单位矩阵时出错

Error while creating Identity matrix using list in 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]]

您可以使用 Numpy 库轻松创建

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

您的代码的问题是 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]]

扩展@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]]
identity = [[int(j == i) for j in range(n_rows)] for i in range(n_rows)]

a = int(输入('enter the Number of matrix you need:: '))

lis = []


for i in range(a):
    new = [0]*a
    new[i] = 1
    lis.append(new)

# Now you can add many identity matrix, Enjoy!

聚会迟到了,但是..

重点是,当您 运行 第二个循环 (for j in range(3):) 时,您将追加对象 null.

的三倍

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

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

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

解决办法就是追加一个copy of the object,把第二个循环改成:

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