Pythonで対角行列を作成したり、対角成分を抽出する次の3つの関数を比較する.
オプションや対応している配列などに多少の違いはあるが、主な役割は次の通り.
- Numpy.diag:対角行列の作成と対角成分の抽出
- Numpy.diagonal:対角成分の抽出
- Numpy.diagflat:対角行列の作成
Numpy.diag
Numpy.daig(v,k=0)
1次元配列 v を対角成分にもつ対角行列を作成する.
整数 k をオプションで入力すると, (i,i+k) 成分に v, それ以外が0になる行列を生成する.
vが2次元配列のときは, 行列の対角成分を取り出す.
オプション k が入ると (i,i+k) 成分を取り出す.
※ v が3次元以上の場合には対応していない.
v = np.array([1,3,4])
print(np.diag(v)) #対角成分が1,3,4の対角行列を作成
print(np.diag(v,k=1)) #(i,i+1)成分に1,3,4が並ぶ
print(np.diag(v,k=-1)) #(i,i-1)成分に1,3,4が並ぶ
""""出力
[[1 0 0]
[0 3 0]
[0 0 4]]
[[0 1 0 0]
[0 0 3 0]
[0 0 0 4]
[0 0 0 0]]
[[0 0 0 0]
[1 0 0 0]
[0 3 0 0]
[0 0 4 0]]
""""
v=np.array([[1,2,3],
[4,5,6],
[7,8,9]])
print(np.diag(v)) #vが2次元配列のときは対角成分を取り出す
print(np.diag(v,k=1))
print(np.diag(v,k=-1))
#[1 5 9]
#[2 6]
#[4 8]
Numpy.diagonal
numpy.diagonal(v, offset=0, axis1=0, axis2=1)
2次元配列 v から対角成分を取り出す.
オプション offset が入ると (i,i+offset) 成分を取り出す.
Numpy.diagとの違い
- オプション名が k ではなく offset になっている.
- v に1次元配列を入力するとエラーがでる. (対角行列を作成することはできない)
- v が3次元以上の配列でも対応している.
- メソッドも用意されている.
v が2次元なら基本的には numpy.diag と同じ
v=np.array([[1,2,3],
[4,5,6],
[7,8,9]])
print(np.diagonal(v))
print(np.diagonal(v,offset=1)) #オプション offset が入ると (i,i+offset) 成分を取り出す.
print(np.diagonal(v,offset=-1))
#[1 5 9]
#[2 6]
#[4 8]
メソッドもある. 使い方は同じ. (numpy.daigにメソッドはないので同じようにやるとエラーが出る)
v=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(v.diagonal())
print(v.diagonal(offset=1))
#[1 5 9]
#[2 6]
v が3次元以上の場合axis1とaxis2で指定した軸をもとに対角成分を取り出す.
以下のサイトに分かりやすい解説がある
numpy.diagonal – 既存の配列の対角線を要素とした配列を生成
v = np.arange(27).reshape(3,3,3)
print(v)
""""
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]]
[[ 9 10 11]
[12 13 14]
[15 16 17]]
[[18 19 20]
[21 22 23]
[24 25 26]]]
""""
print(np.diagonal(v,0,0,1))
#[[ 0 12 24]
# [ 1 13 25]
# [ 2 14 26]]
Numpy.diagflat
numpy.diagflat(v, k=0):配列vを対角成分にもつ対角行列を作成する.
vが2次元配列なら平坦化(flatten)した配列を対角成分に並べる.
整数kはオプションで入力すると, (i,i+k)成分にv, それ以外が0になる行列を生成する.
Numpy.diagとの違い
- vが2次元配列のとき, numpy.diag は対角成分を抽出するが, numpy.diagflat は平坦化した配列を対角成分に並べる.
v = np.array([1,3,4])
print(np.diagflat(v)) #numpy.diagと同じ
print(np.diagflat(v,k=1))
print(np.diagflat(v,k=-1))
"""
[[1 0 0]
[0 3 0]
[0 0 4]]
[[0 1 0 0]
[0 0 3 0]
[0 0 0 4]
[0 0 0 0]]
[[0 0 0 0]
[1 0 0 0]
[0 3 0 0]
[0 0 4 0]]
"""
v = np.array([[1,2],[3,4]])
print(np.diagflat(v)) #2次元以上なら平坦化して対角行列を作る
"""
[[1 0 0 0]
[0 2 0 0]
[0 0 3 0]
[0 0 0 4]]
"""
参考サイト
参考は公式サイトのマニュアル
Numpy.diagのマニュアル
Numpy.diagonalのマニュアル
Numpy.diagflatのマニュアル
コメント