Заменить старый код на более эффективный код - PullRequest
0 голосов
/ 13 ноября 2018

Мне нужно создать последовательность чисел a_t в соответствии со старой последовательностью чисел z_t и a_0. a_t определяется как 27 if t=0 или a(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_0 и суммой по z_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.

1 Ответ

0 голосов
/ 13 ноября 2018

Да,

Вы можете использовать np.cumsum (z), чтобы создать массив и с суммой (z_i) и np.exp (), чтобы снова вычислить, что вы хотите, а затем просто умножить это наa_0.

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