3
如果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)
這個作用:代數,你正在總結的b[i:]
a[i]
倍品滿for i in range(a.size)
。爲此,請翻轉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
類型`A [1] = F的
@ DanielF的優秀答案的以下變體將速度提高了> = 2x:'np.sum(np.cumprod(b [-2 :: -1])[:: - 1] * a [: - 1])+一個[-1]' –
通常計算(A [I-1])'不向量化,除非你很幸運,可以做一個['ufunc'] (https://docs.scipy.org/doc/numpy/reference/ufuncs.html)技巧。我在這裏看不到一種方法。 –