python - 可以在没有循环的情况下生成 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 时间之前加上一些随机噪声。
解决方案
看看这段代码:
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)
推荐阅读
- symfony - API 平台 - 如何使用 DTO 进行发布?
- node.js - util.inspect 默认深度应该是 20,但看起来更小
- html-table - 响应式 HTML 电子邮件的样式 - attribute="x" 与 style="attribute:x;"
- python - Numpy:提取连续数字范围的有效方法
- c - 嵌入式 C- UTF8 转 MARC8
- r - 重命名多个变量的命令
- r - 向量的 diff 函数
- javascript - 如何在打字稿中转换 YYYYMMDDTHHMMSS 中的时间格式
- html - 如何在提交 servlet 类本身的 html 表单后使用“selected”属性保留下拉值
- ruby-on-rails - 带 Rails 的 Capybara:如何只找到不可见的元素