使用 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()
我试图制作一个单位矩阵来求逆矩阵。但是由于代码中的错误,我现在被困住了。新鲜的眼睛会有很大帮助。
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()