Python3でnumpyを用いて計算したいと思っております。2種類の複数のベクトルを1つのベクトルにして,行列ベクトル積を計算したいと思っております。
Python
1import numpy as np 2 3#任意の自然数n1,n2,m1,m2,kで考えたいです. 4n1 = 7 #1種類目の入力の次元 5n2 = 5 #1種類目の出力の次元 6m1 = 3 #2種類目の入力の次元 7m2 = 2 #2種類目の出力の次元 8k = 10 #データの個数 9 10A = np.random.rand(m1, n1) 11B = np.random.rand(m2, n2) 12data = np.random.rand(k * n1 + k * n2) 13 14#方法1 for文 15result = np.empty(k * m1 + k * m2) 16for i in range(k): 17 result[m1 * i:m1*(i+1)] = np.dot(A, data[n1*i:n1*(i+1)]) 18for i in range(k): 19 result[m1*k + m2 * i : m1*k + m2*(i+1)] = np.dot(B, data[n1*k + n2*i: n1*k + n2*(i+1)]) 20 21#方法2 ベクトルを分割し,それぞれ計算する 22d1, d2 = np.split(data, [k * n1]) 23r1 = np.dot(d1.reshape(k, n1), A.T).ravel() 24r2 = np.dot(d2.reshape(k, n2), B.T).ravel() 25result = np.concatenate([r1,r2])
2つの方法で同じ結果を得ることができていますが,各値n1,n2,m1,m2,kが大きくなると時間がかかってしまいます。ベクトルを分割せずに計算する方法や,上記の2つの方法より高速に計算させる方法はありませんでしょうか? よろしくお願いいたします。
###想定している各値の範囲
0 < n1 < 10^3
0 < n2 < 10^3
0 < m1 < 10^3
0 < m2 < 10^3
0 < k < 10^5
大きくなる可能性はありますが,現在想定している各値の範囲です。
回答1件
あなたの回答
tips
プレビュー