Подтвердить что ты не робот

Как преобразовать матрицу столбца или строки в диагональную матрицу в Python?

У меня есть вектор-строка A, A = [a1 a2 a3..... an], и я хотел бы создать диагональную матрицу, B = diag (a1, a2, a3,....., an ) с элементами этого вектора строк. Как это можно сделать в Python?

UPDATE

Это код, иллюстрирующий проблему:

import numpy as np
a = np.matrix([1,2,3,4])
d = np.diag(a)
print (d)

вывод этого кода равен [1], но мой желаемый результат:

[[1 0 0 0]
 [0 2 0 0]
 [0 0 3 0]
 [0 0 0 4]]
4b9b3361

Ответ 1

Вы можете использовать diag метод:

import numpy as np

a = np.array([1,2,3,4])
d = np.diag(a)
# or simpler: d = np.diag([1,2,3,4])

print(d)

Результаты в:

[[1 0 0 0]
 [0 2 0 0]
 [0 0 3 0]
 [0 0 0 4]]

Если у вас есть вектор строки, вы можете сделать это:

a = np.array([[1, 2, 3, 4]])
d = np.diag(a[0])

Результаты в:

[[1 0 0 0]
 [0 2 0 0]
 [0 0 3 0]
 [0 0 0 4]]

Для данной матрицы в вопросе:

import numpy as np
a = np.matrix([1,2,3,4])
d = np.diag(a.A1)
print (d)

Результат снова:

[[1 0 0 0]
 [0 2 0 0]
 [0 0 3 0]
 [0 0 0 4]]

Ответ 2

Я полагаю, вы также можете использовать diagflat:

import numpy
a = np.matrix([1,2,3,4])
d = np.diagflat(a)
print (d)

Что, как и метод Diag, приводит к

[[1 0 0 0]
 [0 2 0 0]
 [0 0 3 0]
 [0 0 0 4]]

но нет необходимости выравнивать с.A1

Ответ 3

Другое решение может быть:

import numpy as np
a = np.array([1,2,3,4])
d = a * np.identity(len(a))

Что касается выступлений для различных ответов здесь, я получаю со timeit на 100000 повторений:

  1. np.array и np.diag (ответ Marcin): 2.18E-02 с
  2. np.array и np.identity (этот ответ): 6.12E-01 с
  3. np.matrix и np.diagflat (ответ Bokee): 1,00E-00 с

Ответ 4

Предполагая, что вы работаете в numpy на основе ваших тегов, это сделает следующее:

import numpy
def make_diag( A ):
    my_diag = numpy.zeroes( ( 2, 2 ) )
    for i, a in enumerate( A ):
        my_diag[i,i] = a
    return my_diag

enumerate (LIST) создает итератор над списком, который возвращает кортежи типа:

(0, 1-й элемент), (1, 2-й элемент), ... (N-1, N-й элемент)