2016-12-17 13 views
0

Я пытаюсь найти местоположения в массиве, где значения монотонно возрастают, так что общее изменение значения больше, чем k. Ie для k = 5 и data = [1, 4, 5, 7, 10, 9, 6, 14, 3, 4] Я хотел бы вернуть:Найти, где значения массива монотонно возрастают над некоторым значением

[4, 7] 

В общем массиве будет поплавки.

Изменить, чтобы уточнить: В примере значения данных монотонно возрастают более чем на 5 через два интервала. Первый из элементов от 0 до 4 (где значения данных увеличиваются на 9), второй - от элемента 6 до 7 (где значения данных увеличиваются на 8). Таким образом, я хочу сообщить о конце каждого допустимого интервала.

Я хочу избежать петель и сделать это эффективным. При необходимости диапазон последовательных значений для проверки может быть ограничен.

+3

Что логика [4,7]? Не могли бы вы объяснить это более ясным образом? – martianwars

+0

Сделано редактирование в разделе уточнения, чтобы дать немного больше деталей. Надеюсь, что они согласуются с идеей проблемы. – Divakar

ответ

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])