【NumPyの使い方】サンプルコード集

NumPy数値解析ライブラリのサンプルコード集です。

使い方の備忘録的な感じで残していきます。

常時更新していきます!(^^)

Sponsored Link

行列の生成 [numpy.array]

<コード>

import numpy as np


# 行列Aの定義
matA = np.array([[2.0, 5.0, 8.0],
                 [1.0, 3.0, 6.0],
                 [7.0, 9.0, 4.0]])

# 行列Aの表示
print(matA)

<実行結果>

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

行列のスカラー倍 [mat * スカラー値]

<コード>

import numpy as np


# 行列Aの定義
matA = np.array([[2.0, 5.0, 8.0],
                 [1.0, 3.0, 6.0],
                 [7.0, 9.0, 4.0]])

# 行列Aのスカラー倍の計算
matAns = matA * 3

# 計算結果の表示
print(matAns)

<実行結果>

[[ 6. 15. 24.]
 [ 3.  9. 18.]
 [21. 27. 12.]]

行列のべき乗 [mat ** スカラー値]

<コード>

import numpy as np


# 行列Aの定義
matA = np.array([[2.0, 5.0, 8.0],
                 [1.0, 3.0, 6.0],
                 [7.0, 9.0, 4.0]])

# 行列Aのべき乗の計算
matAns = matA ** 2

# 計算結果の表示
print(matAns)

<実行結果>

[[ 4. 25. 64.]
 [ 1.  9. 36.]
 [49. 81. 16.]]

行列の積 [matA @ matB]

<コード>

import numpy as np

# 行列Aの定義
matA = np.array([[2.0, 5.0, 8.0],
                 [1.0, 3.0, 6.0],
                 [7.0, 9.0, 4.0]])

# 行列Bの定義
matB = np.array([[9.0, 4.0, 5.0],
                 [2.0, 1.0, 8.0],
                 [7.0, 6.0, 3.0]])

# 行列Aと行列Bの積の計算
matAns = matA @ matB

# 計算結果の表示
print(matAns)

<実行結果>

[[ 84.  61.  74.]
 [ 57.  43.  47.]
 [109.  61. 119.]]

転置行列 [mat.T]

<コード>

import numpy as np


# 行列Aの定義
matA = np.array([[2.0, 5.0, 8.0],
                 [1.0, 3.0, 6.0],
                 [7.0, 9.0, 4.0]])

# 行列Aの転置行列を求める
matAns = matA.T

# 行列Aの転置行列の表示
print(matAns)

<実行結果>

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

行列式 [numpy.linalg.det()]

<コード>

import numpy as np


# 行列Aの定義
matA = np.array([[2.0, 5.0, 8.0],
                 [1.0, 3.0, 6.0],
                 [7.0, 9.0, 4.0]])

# 行列Aの行列式det(A)の計算
detA = np.linalg.det(matA)

# 計算結果の表示
print(detA)

<実行結果>

10.00000000000001

逆行列 [numpy.linalg.inv()]

<コード①>

import numpy as np


# 行列Aの定義
matA = np.array([[2.0, 5.0, 8.0],
                 [1.0, 3.0, 6.0],
                 [7.0, 9.0, 4.0]])

# 行列Aの逆行列invAの計算
invA = np.linalg.inv(matA)

# 逆行列invAの表示
print("逆行列 = ")
print(invA)
print()

# 行列とその逆行列の積は単位行列Iとなる
ideMat = matA @ invA

# 行列Aとその逆行列の積の表示
print("行列Aとその逆行列の積 = ")
print(ideMat)

<実行結果①>

逆行列 = 
[[-4.2  5.2  0.6]
 [ 3.8 -4.8 -0.4]
 [-1.2  1.7  0.1]]

行列Aとその逆行列の積 = 
[[ 1.00000000e+00 -1.77635684e-15  1.11022302e-16]
 [ 8.88178420e-16  1.00000000e+00  1.11022302e-16]
 [ 2.66453526e-15 -3.55271368e-15  1.00000000e+00]]

※単位行列Iの対角成分以外が完全に0となっていませんが、演算過程での桁落ちや情報落ちが原因であると考えられます。

逆行列はその性質上、行列式が0となる場合は逆行列は存在しません。

逆行列が存在しない行列の逆行列を求めようとすると例外numpy.linalg.linalg.LinAlgErrorが返されるようです。

<コード②>

import sys
import numpy as np


# 行列Aの定義
matA = np.array([[2.0, 4.0, 8.0],
                 [1.0, 2.0, 4.0],
                 [7.0, 9.0, 4.0]])

# 行列Aの行列式det(A)の計算
detA = np.linalg.det(matA)

# 行列式の表示
print("行列式 = ", detA)

# 行列Aの逆行列invAの計算
try:
    invA = np.linalg.inv(matA)
except np.linalg.linalg.LinAlgError:
    sys.exit("行列式が0の時は逆行列は存在しない!")

# 行列Aの逆行列の表示
print("逆行列 = ")
print(invA)

<実行結果②>

行列式 =  0.0
行列式が0の時は逆行列は存在しない!

固有値と固有ベクトル [numpy.linalg.eig()]

<コード>

import numpy as np


# 行列Aの定義
matA = np.array([[2.0, 5.0, 8.0],
                 [1.0, 3.0, 6.0],
                 [7.0, 9.0, 4.0]])

# 行列Aの固有値(eigval)と固有ベクトル(eigvec)の計算
eigval, eigvec = np.linalg.eig(matA)

# 計算結果の表示
print("固有値 =")
print(eigval)
print()
print("固有ベクトル =")
print(eigvec)

<実行結果>

固有値 =
[14.9841486  -0.11368296 -5.87046564]

固有ベクトル =
[[-0.58749204 -0.71750212 -0.4756348 ]
 [-0.4009467   0.65993343 -0.45542063]
 [-0.7029188  -0.22288689  0.75257131]]
Sponsored Link