合計を求める必要がある式があるとします。
ここで、境界は有限で既知です。scipy/numpy でこのような合計を計算するための最速または最も効率的な方法は何ですか。ネストされた for ループで実行できますが、より良い方法はありますか?
合計を求める必要がある式があるとします。
ここで、境界は有限で既知です。scipy/numpy でこのような合計を計算するための最速または最も効率的な方法は何ですか。ネストされた for ループで実行できますが、より良い方法はありますか?
どうですか
np.dot(x[:amax], np.cumsum(y[:amax] * np.sum(z[cmin:cmax])))
np.einsum
これらの種類の合計のオプションでもあります。ただし、nevsanが示したように、最初に使用する必要があるためb
、制限されているため、指定された例では高速ではありません。a
np.cumsum
np.einsum
次のようになります。
y_acc = np.add.accumulate(y[:amax]) # same as cumsum
result = np.einsum('i,i,j->', x[:amax], y_acc, z[cmin:cmax])
ただし、これは信じられないほど遅いです.einsumは、z
合計が一度だけ実行される必要があるという事実を最適化しないため、手動で再定式化する必要があります:
result = np.einsum('i,i->', x[:amax], y_summed) * z[cmin:cmax].sum()
ただし、この場合は、nevsan のnp.dot
ベースのアプローチよりも遅くする必要がありdot
ます。通常は最適化する必要があるためです (つまりnp.einsum(ii->, a, b)
、より遅いnp.dot(a, b)
)。ただし、合計する配列がさらにある場合は、良いオプションになる可能性があります。