Python 试图构造单位矩阵?
编写一个函数标识(n),返回n个标识 矩阵。Python 试图构造单位矩阵?,python,arrays,algorithm,list,matrix,Python,Arrays,Algorithm,List,Matrix,编写一个函数标识(n),返回n个标识 矩阵。 例如:标识(3)输出[[1,0,0][0,1,0][0,0,1]] 我尝试了以下方法: def identity(n): matrix=[[0]*n]*n i=0 while i<n: matrix[i][i]=1 i+=1 return matrix 但它的输出为n=5: [[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1
例如:标识(3)输出[[1,0,0][0,1,0][0,0,1]]
我尝试了以下方法:
def identity(n):
matrix=[[0]*n]*n
i=0
while i<n:
matrix[i][i]=1
i+=1
return matrix
但它的输出为n=5
:
[[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]
这是因为您初始化矩阵的方式不同。
[[0]*n]*n
的每个子列表都是相同的列表,或者换句话说,矩阵的每一行都是对相同基础行的引用。您可以使用id
验证这一点:
> x = [[0]*3]*3
> x
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
> id(x[0])
140017690403112
> id(x[1])
140017690403112
> id(x[2])
140017690403112
因此,当您将值赋给矩阵的i
th行时,您将其赋给所有行。因此,避免使用[0]*n
创建嵌套列表。相反,使用
matrix = [[0]*n for _ in range(n)]
更简单的是,通过以下方式避免所有这些情况:
import numpy as np
np.eye(n)
这是因为您初始化矩阵的方式不同。
[[0]*n]*n
的每个子列表都是相同的列表,或者换句话说,矩阵的每一行都是对相同基础行的引用。您可以使用id
验证这一点:
> x = [[0]*3]*3
> x
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
> id(x[0])
140017690403112
> id(x[1])
140017690403112
> id(x[2])
140017690403112
因此,当您将值赋给矩阵的i
th行时,您将其赋给所有行。因此,避免使用[0]*n
创建嵌套列表。相反,使用
matrix = [[0]*n for _ in range(n)]
更简单的是,通过以下方式避免所有这些情况:
import numpy as np
np.eye(n)
如果不允许numpy。。。你知道吗 这样做
def identity(n):
m=[[0 for x in range(n)] for y in range(n)]
for i in range(0,n):
m[i][i] = 1
return m
如果不允许numpy。。。你知道吗 这样做
def identity(n):
m=[[0 for x in range(n)] for y in range(n)]
for i in range(0,n):
m[i][i] = 1
return m
Numpy内置了此功能,您只需使用np.eye(n):
Numpy内置了此功能,您只需使用np.eye(n):
一行代码:
identity=[[0]*i+[1]+[0]*(n-i-1)表示范围内的i(n)]
太晚了,但我一直认为这太长了,于是我想出了:m=[[int(x==y)表示范围内的x(n)]表示范围内的y(n)]
Oneliner:identity=[0]*i+[1]+[0]*(n-i-1)表示范围内的i(n)]
太晚了,但我一直认为这太长了,于是我想出了:m=[[int(x==y)表示范围内的x(n)]表示范围内的y(n)]