/ ¿Tratando de construir una matriz de identidad? [duplicado] - python, arrays, algoritmo, lista, matriz

¿Intentando construir una matriz de identidad? [duplicado] - python, matrices, algoritmo, lista, matriz

Escriba una identidad de función (n) que devuelva la identidad n matriz.
Por ejemplo: identidad (3) salidas [[1,0,0] [0,1,0] [0,0,1]]
He intentado de la siguiente manera:

def identity(n):
matrix=[[0]*n]*n
i=0
while i<n:
matrix[i][i]=1
i+=1
return matrix

También probé con rango pero funcionó así.

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

Pero la salida para 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]]

Respuestas

2 para la respuesta № 1

Si no está permitido numpy ... saber esto Cómo definir una matriz bidimensional en Python

y haz esto

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

3 para la respuesta № 2

Esto es porque la forma en que se está inicializando matrix. Cada sublista de [[0]*n]*n es la misma lista [0]*n, o en otras palabras, cada fila de su matriz es una referencia a la misma fila subyacente. Puedes verificar esto usando 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

Por lo tanto, cuando asigne un valor a la iEn la fila de su matriz, la está asignando a todas las filas. Por lo tanto, evite la creación de listas anidadas usando [0]*n. En su lugar, utilice

matrix = [[0]*n for _ in range(n)]

Aún más simple, evita todo esto con:

import numpy as np
np.eye(n)

1 para la respuesta № 3

Numpy tiene esto incorporado, puedes usar 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.]])