【Python】Numpyのdiag・diagonal・diagflatの違い

Python

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のマニュアル


コメント

タイトルとURLをコピーしました