如果a和b是适当大小的numpy数组,如何对以下计算进行矢量化?
total = a[0]
for ix in range(1, len(a)):
total = total*b[ix-1] + a[ix]
答案 0 :(得分:4)
没关系,如果你做一些代数,有一个ufunc
技巧可行。在这种情况下,ufunc
为multiply
,技巧为accumulate
。
c = np.r_[np.multiply.accumulate(b[0:-1][::-1])[::-1], 1]
total2 = np.sum(a * c)
这样做:代数地,您将a[i]
乘以b[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