我想在时间序列中找到上行/下行模式。这是我用于简单的向上/向下:
diff = np.diff(source, n=1)
encoding = np.where(diff > 0, 1, 0)
Numpy有没有一种方法可以在没有慢速循环的情况下为具有给定回顾长度的模式做到这一点?例如,向上/向上=0向下/向下/向下=1向上/向下/向上=2向上/下/向下=3……
谢谢你的帮助。
我昨天从StackOverflow的一个类似答案中了解到了np.lib.stride_tricks.as_strided
。这是一个很棒的技巧,并不像我预期的那样难以理解。现在,如果你得到了它,让我们定义一个名为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),)