如何在Python中将列矩阵或行矩阵转换为对角矩阵?
How to convert a column or row matrix to a diagonal matrix in Python?
我有一个行向量 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]]
假设您在基于标签的 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
enumerate( LIST ) 在列表上创建一个迭代器,returns 元组如:
( 0, 第一个元素),
( 1, 第二个元素),
...
( N-1, 第 N 个元素 )
可以使用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]]
我想你也可以使用 diagflat:
import numpy
a = np.matrix([1,2,3,4])
d = np.diagflat(a)
print (d)
类似于诊断方法的结果
[[1 0 0 0]
[0 2 0 0]
[0 0 3 0]
[0 0 0 4]]
但不需要用 .A1 压平
另一种解决方案可能是:
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
(Bokee 的回答):1.00E-00 s
我有一个行向量 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]]
假设您在基于标签的 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
enumerate( LIST ) 在列表上创建一个迭代器,returns 元组如:
( 0, 第一个元素), ( 1, 第二个元素), ... ( N-1, 第 N 个元素 )
可以使用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]]
我想你也可以使用 diagflat:
import numpy
a = np.matrix([1,2,3,4])
d = np.diagflat(a)
print (d)
类似于诊断方法的结果
[[1 0 0 0]
[0 2 0 0]
[0 0 3 0]
[0 0 0 4]]
但不需要用 .A1 压平
另一种解决方案可能是:
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 snp.array
和np.identity
(这个答案):6.12E-01 snp.matrix
和np.diagflat
(Bokee 的回答):1.00E-00 s