numpy.diag – 2次元配列から対角線の要素を取得または1次元配列を対角線に配置

numpy.diagは、2次元配列の場合は対角線の要素を抽出した配列、1次元配列の場合はその要素を対角線に配置し、他を0埋めした配列を生成する関数です。

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

目次

1. numpy.diagの使い方

まずはnumpy.diagの基本的な書き方を確認しましょう。

numpy.diag

書き方:

numpy.diag(v, k=0)

パラメーター:

引数   解説
v array_like vが2次元配列の場合は、k番目のインデックスから始まる対角線の要素を格納した新しい配列を生成します。vが1次元配列なら、その要素を対角線に配置した2次元配列を生成します。
k(optional) int要素を取得する対角線の位置を指定します。

戻り値: 

ndarray:2次元配列を渡した場合は、その対角線の要素を格納した配列。1次元配列を渡した場合は、その要素を対角線に配置し、他の要素を0埋めした配列。

一緒に確認したい関数:

  • diagonal: 既存の配列の対角線を要素とした配列を生成
  • diagflat: 対角線が指定の要素、他が0埋めの配列を生成
  • trace: 配列の対角線の要素の合計を取得
  • triu
  • trill

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

1.1. 2次元配列を渡す場合

numpy.diagに2次元配列を渡すと、その配列の対角線の要素を格納した新しい配列を生成します。

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

In [1]:
'''  2次元配列を渡すと対角線の要素を格納した配列を生成  '''
import numpy as np
#  2次元配列を生成
arr = np.arange(9).reshape(3, 3)
arr
Out[1]:
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

この配列を、numpy.diag()に渡すと、対角線の要素を抽出した配列が返ってきます。

In [2]:
#  対角線の要素を格納した配列を生成
np.diag(arr)
Out[2]:
array([0, 4, 8])

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

以下のコードのように正の値を指定すると、指定の値だけ上から右にずれた対角線になります。

In [3]:
#  インデックス1の対角線(上から右にずれる)
np.diag(arr, k=1)
Out[3]:
array([1, 5])

負の値を指定すると、指定の値だけ下から左にずれた対角線になります。

In [4]:
#  インデックス-1の対角線(下から左にずれる)
np.diag(arr, k=-1)
Out[4]:
array([3, 7])

1.2. 1次元配列を渡す場合

1次元配列を渡すと、その配列の要素を対角線に配置し、他の要素を0埋めした2次元配列を返します。元の1次元配列がshape(N)なら、生成される2次元配列はshape(N, N)になります。

以下のコードでご確認ください。

In [5]:
'''  1次元配列を渡すと、その要素を対角線し、他を0埋めの配列を生成'''
arr = np.arange(5)
print('arr:\n', arr)
diag = np.diag(arr)
print('diag:\n', diag)
arr:
 [0 1 2 3 4]
diag:
 [[0 0 0 0 0]
 [0 1 0 0 0]
 [0 0 2 0 0]
 [0 0 0 3 0]
 [0 0 0 0 4]]

1.3. 元の配列の対角線以外の要素を0埋め

次のようにnumpy.diag()を重ねがけして、元の配列の対角線以外の要素を0埋めにするというような使い方もよく見られますので覚えておくと良いでしょう。

In [6]:
'''  次のように重ねがけする場合が多いでしょう  '''
#  配列を生成
arr = np.arange(1, 10).reshape(3, 3)
print('arr:\n', arr)
#  numpy.diag()の重ねがけで対角線の要素以外を0埋め
diag = np.diag(np.diag(arr))
print('diag:\n', diag)
arr:
 [[1 2 3]
 [4 5 6]
 [7 8 9]]
diag:
 [[1 0 0]
 [0 5 0]
 [0 0 9]]

2. まとめ

以上がnumpy.diag()の使い方です。

データサイエンスにおいて対角線の操作は頻繁に行うので、覚えておきましょう。また、以下の関数も確認しておくと良いでしょう。

  • numpy.eye: 対角線の要素が1で他は0埋めの配列を生成
  • numpy.identity: 対角線の要素が1で他は0埋めの正方形の配列を生成
  • numpy.diagonal: 既存の配列の対角線を要素とした配列を生成
  • numpy.diagflat: 対角線が指定の要素、他が0埋めの配列を生成
  • numpy.trace: 配列の対角線の要素の合計を取得

Python初心者におすすめのプログラミングスクール

「未経験からでもPythonを学べるプログラミングスクールを探しているけど、色々ありすぎてわからない」なら、次の3つのプログラミングスクールから選んでおけば間違いはありません。

Aidemy Premium:全くの初心者ができるだけ効率よく短期間で実務的に活躍できるAI人材になることを目的とした講座。キャリアカウンセリングや転職エージェントの紹介などの転職支援も充実しており、受講者の転職成功率が高い。

AIジョブカレPythonの基本をおさえた人が、実際に機械学習やディープラーニングを活用できるようになるための講座。転職補償型があるなどキャリア支援の内容が非常に手厚く、講師の質も最高クラス。コスパ最高。Python初心者用の対策講座もある。

データミックスプログラミング経験者のビジネスマンが、更なるキャリアアップのためにデータの処理方法を学んでデータサイエンティストになるための講座。転職だけでなく起業やフリーランスとして独立する人も多い。Python初心者用の対策講座もある。

特に、あなたが以下のような目標を持っているなら、この中から選んでおけば間違いはないでしょう。

・未経験からPythonエンジニアとして就職・転職したい
・AIエンジニアやデータサイエンティストとしてキャリアアップしたい
・起業やフリーランスを視野に入れたい

理由は「Python初心者のためのおすすめプログラミングスクール3選」で解説しています。



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる