2017-07-06 15 views
3

aとbがnumpy配列の適切なサイズであれば、次の計算をどのようにベクトル化できますか?numpyでこの計算をベクトル化するには

total = a[0] 
for ix in range(1, len(a)): 
    total = total*b[ix-1] + a[ix] 
+0

通常の計算 ([I-1])'あなたは幸運を得ると行うことができない限り、ベクトル化されていません[ 'ufunc'] (https://docs.scipy.org/doc/numpy/reference/ufuncs.html)トリック。私はここでこれを行う方法は見当たりません。 –

答えて

4

気にしないで、あなたには、いくつかの代数をすれば動作しますufuncトリックがあります。この場合、ufuncmultiplyであり、トリックはaccumulateです。

c = np.r_[np.multiply.accumulate(b[0:-1][::-1])[::-1], 1] 
total2 = np.sum(a * c) 

これは何:代数的に、あなたはfor i in range(a.size)b[i:]a[i]回積を加算しています。これを行うには、bを反転し、最後の数字以外のすべての実行中の製品を取得してください(abが同じ長さであると仮定して)。最後の値は1でなければなりません。最後のa値が追加されただけです。

テスト

a = np.random.randint(1, 10, 40) 
b = 1 + np.random.rand(40) 

total = a[0] 
for ix in range(1, len(a)): 
    total = total*b[ix-1] + a[ix] 

total 
278443993.10494208 

total2 
278443993.10494208 
タイプ `[i]は= Fの
+1

@ DanielFの優れた解答の次のバリエーションは、速度を2倍以上に向上させます: 'np.sum(np.cumprod(b [-2 :: - 1))[:: - 1] * a [: - 1])+ a [-1] ' –

関連する問題