我有一个行向量A,A = [a1 a2 a3 ..... an]我想创建一个对角矩阵,B = diag(a1,a2,a3,.....,an )与此行向量的元素。如何在Python中完成?
更新
这是用来说明问题的代码:
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]]
答案 0 :(得分:36)
您可以使用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]]
答案 1 :(得分:6)
我想你也可以使用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
进行展平答案 2 :(得分:0)
另一个解决方案可能是:
import numpy as np
a = np.array([1,2,3,4])
d = a * np.identity(len(a))
对于这里各种答案的表现,我得到timeit
的100000次重复:
np.array
和np.diag
(Marcin的答案):2.18E-02 s np.array
和np.identity
(此答案):6.12E-01 s np.matrix
和np.diagflat
(博基的答案):1.00E-00 s 答案 3 :(得分:-1)
假设你根据你的标签工作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
枚举(LIST)在返回元组的列表上创建一个迭代器,如:
(0,第1个元素), (1,第2个元素), ... (N-1,Nth元素)