我有一个很大的连续数据列表,我试图找出最少条目数时数据在哪里增加,在哪里减少。例如,如果我有列表
[0, 1, 3, 8, 10, 13, 13, 8, 4, 11, 5, 1, 0]
我希望能够捕获 0、1、3、8、10、13、13 和 11、5、1、0 的运行,但不能捕获 8、4 的运行(因为它小于任意数量 3)。
目前我正在使用升序和降序函数一次捕获一定数量的运行(例如,0、1、3 和 1、3、8),但它没有在单个列表中获取整个长度.
关于如何解决这个问题的任何想法?
最佳答案
以下应该工作......它将数据分解为不相交的单调子序列,然后按您的长度标准进行过滤。
def get_monotonic_subsequences(data, min_length):
direction = data[1] - data[0] #determine direction of initial subsequence
subsequences = []
cur_seq = []
for i in range(0, len(data) - 1):
if direction > 0:
if (data[i] >= data[i-1]):
cur_seq.append(data[i])
else:
subsequences.append(cur_seq)
cur_seq = [data[i]]
direction = data[i+1] - data[i]
else:
if (data[i] <= data[i-1]):
cur_seq.append(data[i])
else:
subsequences.append(cur_seq)
cur_seq = [data[i]]
direction = data[i+1] - data[i]
if (data[-1] - data[-2])*direction > 0:
cur_seq.append(data[-1])
subsequences.append(cur_seq)
else:
subsequences.append(cur_seq)
subsequences.append([data[-1]])
return [x for x in subsequences if len(x) >= min_length]
顺便说一句,从您的问题中不清楚,但您的输出表明您希望从左到右贪婪地收集子序列,该代码假定了这一点。
关于python - 确定列表中升序或降序停止的位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19142843/