#python #arrays #numpy
#python #массивы #numpy
Вопрос:
Предположим, у меня есть следующий массив:
arr = [1,2,4,5,6,5,4,3,2,3,4,5,6,7,8]
Я хочу получать только те элементы, которые находятся в порядке возрастания, и игнорировать «обратное» в середине.
Итак, для этого массива я хочу получить: res = [1,2,4,5,6,7,8]
,по индексам: [0,1,2,4,13,14]
Есть идеи?
Комментарии:
1. что вы пробовали до сих пор?
Ответ №1:
Я думаю, вам следует подойти к этому, используя накопленное максимальное значение, то есть максимальное значение на каждом заданном шаге:
>>> arr
array([1, 2, 4, 5, 6, 5, 4, 3, 2, 3, 4, 5, 6, 7, 8])
>>> np.maximum.accumulate(arr)
array([1, 2, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8])
Вы могли бы сделать что-то вроде:
>>> arr[arr == np.maximum.accumulate(arr)]
array([1, 2, 4, 5, 6, 6, 7, 8])
Однако это не касается чисел, которые остаются неизменными (вы получаете дополнительные 6), чтобы справиться с этим, вы можете «свернуть» накопленный максимальный массив и добавить условие, что он не равен этому свернутому массиву (т. Е. Значение массива не равно предыдущемумаксимальное значение):
>>> m = np.maximum.accumulate(arr)
>>> arr[(arr == m) amp; (arr != np.roll(m, -1))]
array([1, 2, 4, 5, 6, 7, 8])
Но на самом деле вам нужны уникальные значения накопленного максимума, поэтому вы также можете просто использовать его с np.unique
:
>>> np.unique(np.maximum.accumulate(arr))
array([1, 2, 4, 5, 6, 7, 8])
Не уверен, что будет быстрее, но получение хороших данных тестирования не является прямым. Если у вас есть массив с возможностью изменения размера, мне было бы интересно, какой подход быстрее работает с вашими данными.