python - 使用 Numpy 对模式进行编码
问题描述
我想在时间序列中找到向上/向下模式。这是我用于简单向上/向下的:
diff = np.diff(source, n=1)
encoding = np.where(diff > 0, 1, 0)
Numpy 有没有办法在没有慢循环的情况下对具有给定回溯长度的模式执行此操作?例如 up/up/up = 0 down/down/down = 1 up/down/up = 2 up/down/down = 3.....
谢谢您的帮助。
解决方案
我昨天从类似于此np.lib.stride_tricks.as_strided
的 StackOverflow 答案之一中了解到。这是一个很棒的技巧,并不像我预期的那样难以理解。现在,如果你明白了,让我们定义一个名为的函数,列出所有要检查的模式:rolling
def rolling(a, window):
shape = (a.size - window + 1, window)
strides = (a.itemsize, a.itemsize)
return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
compare_with = [True, False, True]
bool_arr = np.random.choice([True, False], size=15)
paterns = rolling(bool_arr, len(compare_with))
之后,您可以计算模式匹配的索引,如此处所述
idx = np.where(np.all(paterns == compare_with, axis=1))
样品运行:
bool_arr
array([ True, False, True, False, True, True, False, False, False,
False, False, False, True, True, False])
patterns
array([[ True, False, True],
[False, True, False],
[ True, False, True],
[False, True, True],
[ True, True, False],
[ True, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, True],
[False, True, True],
[ True, True, False]])
idx
(array([ 0, 2, 13], dtype=int64),)
推荐阅读
- javascript - 需要帮助将站点 cookie 连接到表单
- sql - PostgreSQL C Set Returning Function 只返回一行
- docusaurus - 将二进制文件作为资产上传到 docusaurus
- postgresql - 在 Postgresql 中创建一个数量递增的列
- c# - 为什么我的 POST 请求会调用我定义的 GET 函数?
- c# - Entity Framework Core - 从一个表中获取多行作为具有多个属性的 DTO
- wpf - 使用多个集合和自定义标题的 ListView 分组
- c# - 是否可以为另一个域上的组中的用户查询 Active Directory?
- excel - 将代码写入工作表模块时如何保留我的对象?
- c# - 定时器未运行