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)技巧。我在这里看不到一种方法。 –