试图构造身份矩阵?

2024-05-14 16:10:05 发布

您现在位置:Python中文网/ 问答频道 /正文

编写返回n标识的函数标识(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]]

Tags: 方法函数inforreturndefrange矩阵
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)

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

如果不允许使用numpy。。。知道这个How to define two-dimensional array in python

然后做这个

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

相关问题 更多 >

    热门问题