¿Cómo convertir una matriz de columna o fila en una matriz diagonal en Python?

Tengo un vector de fila A, A = [a1 a2 a3 ….. an] y me gustaría crear una matriz diagonal, B = diag (a1, a2, a3, ….., an) con el elementos de este vector fila. ¿Cómo se puede hacer esto en Python?

ACTUALIZAR

Este es el código para ilustrar el problema:

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

la salida de este código es [1], pero mi salida deseada es:

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

Puedes usar el método 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) 

Resultados en:

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

Si tienes un vector fila, puedes hacer esto:

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

Resultados en:

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

Para la matriz dada en la pregunta:

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

El resultado es de nuevo:

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

Supongo que también podrías usar diagflat :

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

Lo que al igual que el método diag da como resultado

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

pero no hay necesidad de aplanar con .A1

Otra solución podría ser:

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

En cuanto a las actuaciones para las diversas respuestas aquí, recibo con timeit en 100000 repeticiones:

  1. np.array y np.diag (la respuesta de Marcin): 2.18E-02 s
  2. np.array y np.identity (esta respuesta): 6.12E-01 s
  3. np.matrix y np.diagflat (respuesta de Bokee): 1.00E-00 s

Suponiendo que esté trabajando en una gran cantidad según sus tags, esto lo hará:

 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) crea un iterador sobre la lista que devuelve tuplas como:

(0, 1er elemento), (1, 2do elemento), … (N-1, Nth elemento)