首页 > 解决方案 > 可以在没有循环的情况下生成 AR(1) 过程吗?

问题描述

是否可以将以下 Python 代码循环转换为 Python 中没有循环的代码?

steps = 10000
rho = 0.9

e = np.random.randn(steps)
y = [0]

# Possible to get rid of this loop?
for i in range(len(e)):
    y.append(rho*y[i] + e[i])

该代码用于生成简单的自回归(1 阶)时间序列,其中给定一些起始值,每个下一个值都是 rho 时间之前加上一些随机噪声。

https://en.wikipedia.org/wiki/Autoregressive_model

标签: pythonnumpy

解决方案


看看这段代码:

import numpy as np

steps = 10000
rho = 0.9
np.random.seed(0)
e = np.random.randn(steps)

z = list(np.zeros(steps))
z[:] = map(lambda x, y: rho*z[y] + x, list(e), list(range(steps)))

方法二:

m = list(np.zeros(steps))
m[:] = map(lambda x, y: m.append(rho*m[y] + x), list(e), list(range(steps)))
m = m[10000:]
print(m)

来自 ipython 的一些快速基准测试

In [1]: timeit z[:] = map(lambda x, y: rho*z[y] + x, list(e), list(range(steps)))
1.27 ms ± 19.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [2]: timeit m[:] = map(lambda x, y: m.append(rho*m[y] + x), list(e), list(range(steps)))
1.39 ms ± 31.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [3]: timeit for i in range(len(e)): y.append(rho*y[i] + e[i])
8.18 ms ± 270 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

推荐阅读