17. Numpyを使ったベクトル・行列演算入門

17.1. Numpyのインストール

  • 2021年度学生

    • source ~/.venv/prog1/bin/activate

    • pip install numpy

  • 2020年度学生

    • conda install numpy


17.2. 共通した流れ

  • Step1: Numpyモジュールを読み込む

  • Step2: 演算したいデータ(ベクトルor行列)をnumpy.ndarray型オブジェクトとして表現する。

  • Step3: 演算する。


17.3. 具体例: 行列の用意、スカラーと行列の演算、行列同士の足し算、転置、行列積、行列式、逆行列、固有値、固有ベクトル

# 慣例としてnpというエイリアスを付けることが多い。
import numpy as np

# 2行2列の行列を用意。
# 1行を1リストとして列挙し、全体をリストで囲う。
a = np.array([[1., 0.], [0., 2.]])
b = np.array([[1, 2], [3, 4]])

# 変数の中身を確認。
print(a)

# 行列と数値の演算。
# numpy.ndarray型オブジェクトと、int型もしくはfloat型オブジェクトの四則演算をすると、
# 全ての要素に対する四則演算になる。
c = a + 2
print(c)
c = a - 2
print(c)
c = a * 2
print(c)
c = a / 2
print(c)

# 行列同士の足し算。
# これまでに習った「list型」だと、+演算子はリスト同士の結合になるが、
# numpy.ndarray型だと「行列同士の足し算」になる。
c = a + b
print(c)

# 行列の転置。
# numpy.ndarray型オブジェクトに対して「.T」を付けると天地になる。
print(a)
print(a.T)

# 行列同士の積。
# *演算子ではなく、専用の関数 np.dot() を使うことに注意。
# 通常の掛け算と異なり、行列を掛ける順番によって結果も異なる。
c = np.dot(a, b)
print(c)
c = np.dot(b, a)
print(c)

# 行列式を求める。
c = np.linalg.det(a)
print(c)

# 逆行列を求める。
c = np.linalg.inv(a)
print(c)

# 逆行列が正しいか検算してみる。
inv_a = np.linalg.inv(a)
c = np.dot(a, inv_a)
print(c)
c = np.dot(inv_a, a)
print(c)

# 固有値・固有ベクトルを求める。
# np.linalg.eig() 関数で両方を一度に求めることができる。
# 戻り値の1つ目が固有値、2つ目が固有ベクトル。
eigenvalues, eigenvectors = np.linalg.eig(a)
print('固有値: {0}'.format(eigenvalues))
print('固有ベクトル:\n{0}'.format(eigenvectors))

17.4. よく使う機能: 0行列、1行列、対角行列

  • 0行列: np.zeros()

  • 1行列: np.ones()

  • 対角行列: np.eye(), np.diag()