numpy.diagonal – 既存の配列の対角線を要素とした配列を生成

numpy.diagonalは、指定した対角線の要素を格納した新しい配列を生成する関数です。

渡した配列が2次元配列なら、指定した位置の対角線の要素を配列で返します。3次元以上の配列を渡した場合は、オプション引数のaxis1とaxis2で指定した軸の2次元配列の対角線要素を配列で返します。

実際のコードで確認していきましょう。

目次

1. numpy.diagonalの使い方

それでは、numpy.diagonalの書き方を確認しましょう。

numpy.diagonal

書き方:

np.diagonal(a, offset=0, axis1=0, axis2=1)

パラメーター:

引数   解説
a array_like 配列を渡します。
offset(optional) intどの対角線の要素を取得したいのかを指定します。正の値、負の値のどちらでも可能です。デフォルトは0です。
axis1(optional) int3次元配列以上の場合で、どの軸を、対角線を取得する2次元配列の軸の1つとするのかを指定します。デフォルトは0です。
axis2(optional) int 3次元配列以上の場合で、どの軸を、対角線を取得する2次元配列のもう1つの軸とするのかを指定します。デフォルトは1です。

戻り値: 

array_of_diagonal: ndarray
渡した配列aが2次元配列なら、対角線の要素を格納した1次元配列を返します。3次元配列以上の場合は、axis1とaxis2で指定した軸を取り除いて、その両者のうちで要素数が小さい方を最後の軸に付け加えたshapeの2次元配列を返します。

例外: 

ValueError
渡した配列aの次元数が2次元よりも小さい場合はバリューエラーになります。

一緒に確認したい関数:

  • diag: 2次元配列から対角線の要素を取得または1次元配列を対角線に配置
  • diagflat: 対角線が指定の要素、他が0埋めの配列を生成
  • trace: 配列の対角線の要素の合計を取得

それではサンプルコードを見ながら、使い方を確認していきましょう。

1.1. 配列の対角線の要素を格納した配列を生成

numpy.diagonalに2次元配列を渡した場合、その配列の対角線の要素を格納した新しい配列を返します。

まず、以下のコードでshape(5, 5)の2次元配列を生成します。

In [1]:
import numpy as np
arr = np.random.randint(1, 10, (5, 5))
print(arr)
[[6 7 7 9 9]
 [2 2 4 8 4]
 [6 4 1 6 3]
 [6 9 1 2 6]
 [2 9 3 9 9]]

この配列をnumpy.diagonal()に渡すと次のように対角線の要素を格納した配列が戻されています。

In [2]:
#  対角線を要素とした配列を生成
np.diagonal(arr)
Out[2]:
array([6, 2, 1, 2, 9])

1.2. どの対角線の要素を取得するかを指定(offset)

オプション引数「offset=」では、元の配列のどこの対角線の要素を取得するかを指定することができます。

正の値を指定すると、対角線は上から右にその値だけずれます。負の値を指定すると、対角線は下から左にその値だけずれます。

以下のコードでそれぞれ確認しましょう。

In [3]:
#  offsetで正の値を指定した場合、その値だけ右にずれる
np.diagonal(arr, offset=1)
Out[3]:
array([7, 4, 6, 6])
In [4]:
#  offsetで負の値を指定した場合、その値だけ左にずれる
np.diagonal(arr, offset=-2)
Out[4]:
array([6, 9, 3])

1.3. 3次元配列以上の場合(axis1, axis2)

numpy.diagonal()に渡す配列が3次元配列以上の多次元配列の場合、どの軸の対角線要素を取得したいのかを、オプション引数「axis1=」「axis2=」を指定します。

デフォルトでは「axis1=0」「axis2=1」になっています。

以下のshape(2, 3, 4)の3次元配列を例に見て行きましょう。

In [5]:
'''  3次元配列の場合  '''
arr = np.random.randint(1, 10, (2, 3, 4))
print(arr)
[[[1 2 4 6]
  [1 5 6 1]
  [4 3 9 7]]

 [[8 4 1 2]
  [9 6 5 3]
  [4 9 1 5]]]

この3次元配列をnumpy.diagonal()に渡すと、次のように返ってきます。

In [6]:
#  デフォルトはaxis0とaxis1の2次元配列として、その対角線を返す。
np.diagonal(arr)
Out[6]:
array([[1, 9],
       [2, 6],
       [4, 5],
       [6, 3]])

3次元配列の場合、axis=0は「奥行き」、axis=1は「行」、axis=2は「列」です。そのため、デフォルトの「axis1=0, axis2=1」では奥行き方向の要素を1つの軸に、行方向の要素を1つの軸にした2次元配列の対角線の要素を取得しています。

デフォルトの「axis1=0, axis2=1」の場合、奥行き方向と行方向を軸とした2次元配列の対角線の要素を取得する。

なお、3次元配列を渡すとしたら、戻ってくる配列のshapeは、shape(指定しなかった軸の要素数, 指定した軸の要素数が小さい方)になります。上の例では、元の配列はshape(2, 3, 4)ですので、新しく生成される配列はshape(4, 2)になります。

次に、「axis1=0, axis2=2」を指定した場合を見てみましょう。

以下をご覧ください。

In [7]:
#  奥行き方向の要素を列として並べた2次元配列の対角線を返す
np.diagonal(arr, axis1=0, axis2=2)
Out[7]:
array([[1, 4],
       [1, 6],
       [4, 9]])

この場合、奥行き方向の要素を1つの軸に、列方向の要素をもう1つの軸にした2次元配列の対角線の要素を取得しています。

「axis1=0, axis2=2」の場合、奥行き方向と列方向を軸とした2次元配列の対角線の要素を取得する。

元の配列はshape(2, 3, 4)なので、対角線要素の配列は、shape(指定しなかった軸の要素数, 指定した軸の要素数の小さい方)で、shape(3, 2)になります。

「axis1=1, axis=2」では、以下のコードのように行方向と列方向を軸とした2次元配列の対角線の要素を取得します。

In [8]:
#  行方向の要素を列として並べた2次元配列の対角線を返す。
np.diagonal(arr, axis1=1, axis2=2)
Out[8]:
array([[1, 5, 9],
       [8, 6, 1]])

2. まとめ

以上が、numpy.diagonalの使い方です。NumPyの配列の対角線操作については、以下の関数も併せて確認しておくと良いでしょう。

  • eye: 対角線の要素が1で他は0埋めの配列を生成
  • identity: 対角線の要素が1で他は0埋めの正方形の配列を生成
  • diag: 2次元配列から対角線の要素を取得または1次元配列を対角線に配置
  • diagflat: 対角線が指定の要素、他が0埋めの配列を生成
  • trace: 配列の対角線の要素の合計を取得



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる