Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 试图构造单位矩阵?_Python_Arrays_Algorithm_List_Matrix - Fatal编程技术网

Python 试图构造单位矩阵?

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

编写一个函数标识(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, 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)]