2017-07-06 91 views
3

如果a和b是適當大小的numpy數組,則如何矢量化以下計算?如何在numpy中矢量化此計算

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

通常計算(A [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) 

這個作用:代數,你正在總結的b[i:]a[i]倍品滿for i in range(a.size)。爲此,請翻轉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 
類型`A [1] = F的
+1

@ DanielF的優秀答案的以下變體將速度提高了> = 2x:'np.sum(np.cumprod(b [-2 :: -1])[:: - 1] * a [: - 1])+一個[-1]' –