/ / Спроба побудувати матрицю ідентичності? [duplicate] - python, масиви, алгоритм, список, матриця

Спробуємо побудувати матрицю ідентичності? [дублікат] - python, масиви, алгоритм, список, матриця

Напишіть функцію ідентичності (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 працювати, як це

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

Відповіді:

2 для відповіді № 1

Якщо numpy не дозволено ... Знайте це Як визначити двовимірний масив в 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

3 для відповіді № 2

Це тому, що ви ініціалізуєте matrix. Кожен підсписок Росії [[0]*n]*n є того ж списку [0]*nабо іншими словами, кожен рядок вашої матриці є a довідка до того ж основного рядка. Це можна перевірити за допомогою 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

TТаким чином, при призначенні значення iУ рядку вашої матриці ви призначаєте її всім рядкам [0]*n. Замість цього використовуйте

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

Ще простіше, уникайте всього цього з:

import numpy as np
np.eye(n)

1 для відповіді № 3

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