web-dev-qa-db-ja.com

Pythonで列または行行列を対角行列に変換する方法は?

行ベクトルA、A = [a1 a2 a3 ..... an]があり、対角行列B = diag(a1、a2、a3、.....、an)を作成したいこの行ベクトルの要素。これをPythonでどのように行うことができますか?

[〜#〜] update [〜#〜]

これは問題を説明するコードです:

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

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

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で平坦化する必要はありません

6
Bokee

別の解決策は次のとおりです。

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

ここでのさまざまな回答のパフォーマンスについては、timeitを100000回繰り返して取得します。

  1. np.arrayおよびnp.diag(Marcinの回答):2.18E-02 s
  2. np.arrayおよびnp.identity(この回答):6.12E-01 s
  3. np.matrixおよびnp.diagflat(Bokeeの回答):1.00E-00 s
0
jeannej