7

私は次のタイプの多くのループをしなければなりません

for i in range(len(a)):
    for j in range(i+1):
        c[i] += a[j]*b[i-j]

ここで、aとbは短い配列です(同じサイズで、約10から50の間です)。これは、畳み込みを使用して効率的に実行できます。

import numpy as np
np.convolve(a, b) 

ただし、これにより完全な畳み込みが得られます(つまり、上記のforループと比較してベクトルが長すぎます)。畳み込みで「同じ」オプションを使用すると、中央部分が取得されますが、必要なのは最初の部分です。もちろん、完全なベクトルから不要なものを切り落とすことはできますが、可能であれば不要な計算時間を取り除きたいと思います。誰かがループのより良いベクトル化を提案できますか?

4

2 に答える 2

2

numpy でベクトル化された配列操作で畳み込みを行う方法はありません。あなたの最善の策は、 np.convolve(a, b, mode='same') を使用して、不要なものを切り取ることです。それはおそらく、上記の純粋な python の二重ループよりも 10 倍高速になるでしょう。速度が本当に気になる場合は、Cython を使用して独自のロールを作成することもできますが、np.convolve() よりもはるかに高速ではない可能性があります。

于 2012-10-10T14:06:56.903 に答える