用更高效的代码替换旧代码

Replace a old code by a more efficient code

我需要根据旧的数字序列 z_ta_0 创建数字序列 a_ta_t 定义为等于 27 if t=0a(t-1)exp(z(t-1)) for t>=1.

在使用生成器时,代码很简单

import math

def a_t(zs, a=27):
    z = next(zs)
    yield a
    for z in zs:
        a *= math.exp(z)
        yield a

似乎可以只使用 a_0z_t-1, z_t-2, ..., z0 的总和,而不是等待 a_t-1 计算 a_t。因此可以向量化计算而不是一个接一个地计算 a_i。是否可以使用 numpy 编码以下序列以进行矢量化,即 a_t = a_0 exp(sum(z_i)) 用于 i=0 to t-1?计算速度可能更快,因为我们已经知道序列 z_t.

是的,

您可以使用 np.cumsum(z) 创建一个带有 sum(z_i) 和 np.exp() 的 and 数组,再次计算您想要的结果,然后乘以a_0.

a_0 = 27
z = np.array([1,2,3])
cs = np.cumsum(z)
result = np.exp(cs)*a_0