web-dev-qa-db-fra.com

Comment convertir une matrice de colonnes ou de lignes en matrice diagonale en Python?

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]]
16
Tom Kurushingal

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

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

5
Bokee

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:

  1. np.array et np.diag (réponse de Marcin): 2.18E-02 s
  2. np.array et np.identity (cette réponse): 6.12E-01 s
  3. np.matrix et np.diagflat (réponse de Bokee): 1.00E-00 s
0
jeannej