Массив Numpy, получающий только элементы и индексы в порядке возрастания

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

Не уверен, что будет быстрее, но получение хороших данных тестирования не является прямым. Если у вас есть массив с возможностью изменения размера, мне было бы интересно, какой подход быстрее работает с вашими данными.