J'ai un vecteur ligne A, A = [a1 a2 a3 ..... an] et je voudrais créer une matrice diagonale, B = diag (a1, a2, a3, ....., an) avec le éléments de ce vecteur ligne. Comment cela peut-il être fait en Python?
METTRE À JOUR
C'est le code pour illustrer le problème:
import numpy as np
a = np.matrix([1,2,3,4])
d = np.diag(a)
print (d)
la sortie de ce code est [1], mais ma sortie souhaitée est:
[[1 0 0 0]
[0 2 0 0]
[0 0 3 0]
[0 0 0 4]]
Vous pouvez utiliser diag method:
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)
Résulte en:
[[1 0 0 0]
[0 2 0 0]
[0 0 3 0]
[0 0 0 4]]
Si vous avez un vecteur ligne, vous pouvez faire ceci:
a = np.array([[1, 2, 3, 4]])
d = np.diag(a[0])
Résulte en:
[[1 0 0 0]
[0 2 0 0]
[0 0 3 0]
[0 0 0 4]]
Pour la matrice donnée dans la question:
import numpy as np
a = np.matrix([1,2,3,4])
d = np.diag(a.A1)
print (d)
Le résultat est encore:
[[1 0 0 0]
[0 2 0 0]
[0 0 3 0]
[0 0 0 4]]
Je suppose que vous pourriez aussi utiliser diagflat :
import numpy
a = np.matrix([1,2,3,4])
d = np.diagflat(a)
print (d)
Qui, comme la méthode diag a pour résultat
[[1 0 0 0]
[0 2 0 0]
[0 0 3 0]
[0 0 0 4]]
mais il n'y a pas besoin d'aplanir avec .A1
Une autre solution pourrait être:
import numpy as np
a = np.array([1,2,3,4])
d = a * np.identity(len(a))
En ce qui concerne les performances pour les différentes réponses ici, je reçois timeit
sur 100000 répétitions:
np.array
et np.diag
(réponse de Marcin): 2.18E-02 snp.array
et np.identity
(cette réponse): 6.12E-01 snp.matrix
et np.diagflat
(réponse de Bokee): 1.00E-00 s