如何将此计算矢量化为numpy

如何将此计算矢量化为numpy,numpy,vectorization,Numpy,Vectorization,如果a和b是大小合适的numpy数组,如何将以下计算矢量化 total = a[0] for ix in range(1, len(a)): total = total*b[ix-1] + a[ix] 没关系,如果你做一些代数的话,有一个ufunc技巧是有效的。在这种情况下,ufunc是multiply,诀窍是acculate c = np.r_[np.multiply.accumulate(b[0:-1][::-1])[::-1], 1] total2 = np.sum(a * c)

如果a和b是大小合适的numpy数组,如何将以下计算矢量化

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

没关系,如果你做一些代数的话,有一个
ufunc
技巧是有效的。在这种情况下,
ufunc
multiply
,诀窍是
acculate

c = np.r_[np.multiply.accumulate(b[0:-1][::-1])[::-1], 1]
total2 = np.sum(a * c)
这是做什么的:代数上,你是把
a[i]
乘以
b[i:][/code>的乘积加在
上,求出i的范围(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[i]=f(a[i-1])
类型的计算是不可矢量化的,除非你运气好,可以做点小动作。我看不出有什么办法可以做到这一点。@DanielF的优秀答案的以下变体将速度提高了2倍:
np.sum(np.cumprod(b[-2:-1])[:-1]*a[:-1])+a[-1]