找出数值在某个值

时间:2016-12-17 18:58:04

标签: python performance numpy vectorization

我正在尝试在数组中找到值,这些位置的值会单调增加,以使值的总变化大于k。 即k = 5data = [1, 4, 5, 7, 10, 9, 6, 14, 3, 4] 我想回来:

[4, 7]

通常,数组将是浮点数。

编辑以进一步澄清:在示例中,数据值在两个时间间隔内单调增加大于5。第一个是从元素0到4(其中数据值增加9),第二个是从元素6到7(其中数据值增加8)。因此,我想报告每个有效间隔的结束。

我想避免循环并使其高效。如有必要,可以限制要检查的连续值的范围。

1 个答案:

答案 0 :(得分:2)

这是一种矢量化方法 -

d = a[1:] - a[:-1]
mask = np.concatenate(( [False], d > 0, [False] ))
start = np.flatnonzero(mask[1:] > mask[:-1])
stop = np.flatnonzero(mask[1:] < mask[:-1])
count = np.bincount(np.repeat(np.arange(start.size) ,stop - start), d[mask[1:-1]])
out = stop[count > k]

示例输入,输出 -

In [202]: a # Adding in two monotonically decreasing elems at start for variety
Out[202]: array([10,  7,  1,  4,  5,  7, 10,  9,  6, 14,  3,  4])

In [203]: k = 5

In [204]: out
Out[204]: array([6, 9])