试图构建单位矩阵?

时间:2016-10-26 18:31:59

标签: python arrays algorithm list matrix

写一个返回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]]

3 个答案:

答案 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.]])