web-dev-qa-db-de.com

Wie konvertiert man eine Spalten- oder Zeilenmatrix in eine Diagonalmatrix in Python

Ich habe einen Zeilenvektor A, A = [a1 a2 a3 ..... an] und ich möchte eine diagonale Matrix erstellen, B = diag (a1, a2, a3, ....., an) mit Elemente dieses Zeilenvektors. Wie kann das in Python gemacht werden?

UPDATE

Dies ist der Code, um das Problem zu veranschaulichen:

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

die Ausgabe dieses Codes ist [1], aber meine gewünschte Ausgabe ist:

[[1 0 0 0]
 [0 2 0 0]
 [0 0 3 0]
 [0 0 0 4]]
16
Tom Kurushingal

Sie können die Methode diag verwenden:

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)

Ergebnisse in:

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

Wenn Sie einen Zeilenvektor haben, können Sie Folgendes tun:

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

Ergebnisse in:

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

Für die gegebene Matrix in der Frage:

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

Ergebnis ist wieder:

[[1 0 0 0]
 [0 2 0 0]
 [0 0 3 0]
 [0 0 0 4]]
34
Marcin

Ich vermute, Sie könnten auch diagflat verwenden:

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

Was sich wie die diag-Methode ergibt 

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

mit .A1 muss jedoch nicht abgeflacht werden

5
Bokee

Eine andere Lösung könnte sein:

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

Was die Leistungen für die verschiedenen Antworten betrifft, so bekomme ich mit timeit auf 100000 Wiederholungen

  1. np.array und np.diag (Marcins Antwort): 2.18E-02 s
  2. np.array und np.identity (diese Antwort): 6.12E-01 s
  3. np.matrix und np.diagflat (Antwort von Bokee): 1.00E-00 s
0
jeannej