写一个返回n身份的函数identity(n)
矩阵。
例如:identity(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
我也试过范围,但它确实没有像这样工作
def identity(n):
matrix=[[0]*n]*n
k=matrix[:]
i=0
for i in range(1,n):
matrix[i][i]=1
i+=1
return k
print(identity(5))
但它输出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 :(得分:3)
这是因为您初始化matrix
的方式。 [[0]*n]*n
的每个子列表是相同的列表[0]*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
行指定一个值时,您将其分配给所有行。因此,请使用[0]*n
避免嵌套列表创建。相反,使用
matrix = [[0]*n for _ in range(n)]
更简单,避免所有这些:
import numpy as np
np.eye(n)
答案 1 :(得分:3)
如果不允许numpy ...了解How to define two-dimensional array in python
并执行此操作
#include <string.h>
....
if (newNode->data != NULL)
{
strcpy(newNode->data, str);
}
else
{
// handle error
}
答案 2 :(得分:1)
Numpy内置了这个,你可以使用np.eye(n):
In [1]: import numpy as np
In [2]: x = np.eye(4)
In [3]: x
Out[3]:
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])