NumPyとは
皆様も御存知の通り、Pythonは機械学習やAI分野に強いプログラミング言語です。
その理由は数学系の学術ライブラリの潤沢さにあります。
NumPyはその代表格とも言えるPythonのライブラリです。
NumPyを使って行列計算(乗算)
行列の乗算をNumPyを使って処理してみようと思います。
人間の手計算では正方行列33でも苦労すると思います。
ここでは100100を処理した時間を計測したいと思います。
# NumPyをインポート
import numpy as np
import time
from numpy.random import rand
# 行列 100*100を指定
N = 100
# 行列を初期化、乱数を発生させる
matA = np.array(rand(N, N))
matB = np.array(rand(N, N))
matC = np.array([[0] * N for _ in range(N)])
# 開始時間を取得
start = time.time()
# 行列乗算を実行
matC = np.dot(matA, matB)
# 小数第2位で打ち切って出力
print("NumPyを使った計算結果:%.2f[sec]" % float(time.time() - start))
処理結果
NumPyを使った計算結果:0.03[sec]
NumPyを使わず、Pythonのfor文をネストして計算
# NumPyをインポート
import numpy as np
import time
from numpy.random import rand
# 行列 100*100を指定
N = 100
# 行列を初期化、乱数を発生させる
matA = np.array(rand(N, N))
matB = np.array(rand(N, N))
matC = np.array([[0] * N for _ in range(N)])
# 開始時間を取得
start = time.time()
# for文をネスト
for i in range(N):
for j in range(N):
for k in range(N):
matC[i][j] = matA[i][k] * matB[k][j]
print("Pythonのfor文での計算結果:%.2f[sec]" % float(time.time() - start))
処理結果
Pythonのfor文での計算結果:0.92[sec]
100*100の行列計算ではNumPyとfor文のネストでは約9倍もの処理時間の差
ライブラリを使うと単にコードが平易に扱いやすくなるだけでなく、
処理時間も大幅に削減でき、またシステムの負荷も大幅に下げられることが伺えます。
勉強あるのみですね。
■ 参考文献
Pythonで動かして学ぶ! あたらしい深層学習の教科書 機械学習の基本から深層学習まで (AI & TECHNOLOGY) 株式会社アイデミー石川聡彦 著
https://www.shoeisha.co.jp/book/detail/9784798158570