0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Python】NumPyを使った行列の乗算処理時間

Posted at

NumPyとは

皆様も御存知の通り、Pythonは機械学習やAI分野に強いプログラミング言語です。
その理由は数学系の学術ライブラリの潤沢さにあります。
NumPyはその代表格とも言えるPythonのライブラリです。

NumPyを使って行列計算(乗算)

行列の乗算をNumPyを使って処理してみようと思います。
人間の手計算では正方行列33でも苦労すると思います。
ここでは100
100を処理した時間を計測したいと思います。

# 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

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?