如何在Python中将列或行矩阵转换为对角矩阵?

46

我有一个行向量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]]
4个回答

72
你可以使用 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]]

你能否尝试将a从数组改为矩阵。 - Tom Kurushingal
如果你能编辑你的问题并提供实际的代码示例、输入和期望的输出,以及你遇到的错误等,那会更容易一些。否则就像在猜谜一样。 - Marcin

11

我想你也可以使用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 不需要压平数组


1
另一种解决方案可能是:

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

关于这里的各种答案的性能,我使用 timeit 在 100000 次重复中得到了以下结果:

  1. np.arraynp.diag(Marcin 的答案):2.18E-02 秒
  2. np.arraynp.identity(本回答):6.12E-01 秒
  3. np.matrixnp.diagflat(Bokee 的答案):1.00E-00 秒

0

假设您正在使用基于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)创建一个迭代器,该迭代器返回如下的元组:

(0,第一个元素), (1,第二个元素), ... (N-1,第N个元素)


2
良好的numpy风格将避免迭代。 - mrplants

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接