行列(ベクトル)計算を高速化したいです
以下のようなプログラムを仮定します
python
1import numpy as np 2import math 3import random 4 5m = 5 6v = ["a","b","c"] 7V = ["a","b","c","d","e"] 8a = [random.random() for _ in range(len(V))] 9b = [[random.random() for _ in range(len(V))] for _ in range(m)] 10 11 12sol = [] 13 14def func(a,bz,c,d): 15 return math.exp(c+d) / (sum([math.exp(aa + bb) for aa, bb in zip(a, bz)])) 16 17for z in range(m): 18 sol.append(np.prod([func(a, b[z], a[V.index(w)], b[z][V.index(w)]) for w in v]))
これをさらに速くする書き方ありますか?
zip(a, b) で a と b の次元数が異なると min(n, m) 次元数分しかループが回らない気がするのですが、それでいいのでしょうか?あと c, d はどのような配列ですか?
動くコードを記載してください。
すみません.更新しました.ちなみに次元数は同じです
sum や exp は numpy なのか標準ライブラリの math モジュールなのか、どちらでしょうか?
それによって意味が変わってきます。提示されたコードでは動かないです。
mathを使っています
a → n×1ベクトル, b → n×mベクトル とのことなので、aa はスカラー、bb は形状 (m,) の配列になり、aa + bb の結果も(m,) の配列になりますよね?math.exp() の引数はスカラーしか対応してないので、配列を引数にはとれないと思いますが。実際、提示されたコードだとエラーがでて動かないです。
すみません.若干コードを変更しました.bbもスカラーになるはずです
実際に動作するコードを提示されないと回答は難しいと思われます。
一応動くはずなのですが,一般化の途中で間違えているのでしょうか…
提示コードをコピペし実行するとエラーになります。最低限動作するコードを提示くださいということです。
これで動くと思います.よろしくお願いします
回答2件
あなたの回答
tips
プレビュー