2017-07-06 106 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]' –