aとbがnumpy配列の適切なサイズであれば、次の計算をどのようにベクトル化できますか?numpyでこの計算をベクトル化するには
total = a[0]
for ix in range(1, len(a)):
total = total*b[ix-1] + a[ix]
aとbがnumpy配列の適切なサイズであれば、次の計算をどのようにベクトル化できますか?numpyでこの計算をベクトル化するには
total = a[0]
for ix in range(1, len(a)):
total = total*b[ix-1] + a[ix]
気にしないで、あなたには、いくつかの代数をすれば動作しますufunc
トリックがあります。この場合、ufunc
はmultiply
であり、トリックは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
を反転し、最後の数字以外のすべての実行中の製品を取得してください(a
とb
が同じ長さであると仮定して)。最後の値は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の
@ DanielFの優れた解答の次のバリエーションは、速度を2倍以上に向上させます: 'np.sum(np.cumprod(b [-2 :: - 1))[:: - 1] * a [: - 1])+ a [-1] ' –
通常の計算 ([I-1])'あなたは幸運を得ると行うことができない限り、ベクトル化されていません[ 'ufunc'] (https://docs.scipy.org/doc/numpy/reference/ufuncs.html)トリック。私はここでこれを行う方法は見当たりません。 –