如何将此计算矢量化为numpy
如果a和b是大小合适的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)
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]