Получение индексов из n наивысших элементов до значения tage

132
7

У меня есть список температур, и мне нужно найти n значений до и после желаемой температуры, предпочтительно в отдельных списках. Значения в моем списке не обязательно уникальны, но мне нужен индекс исходного списка. Мне нужны эти индексы для поиска других параметров в других списках.

Пример:

TestArray = np.array([12,42,19,32,41,14,17,23,12,18,32,19])
Value = 20
n = 2
TestArray = np.append(TestArray, Value)
Sort = np.argsort(TestArray)
Index = np.where(Sort == (len(TestArray)-1))[0][0]
Lower = Sort[Index-n:Index]
Upper = Sort[Index+1:Index+n+1]
print(Upper, TestArray[Upper])
print(Lower, TestArray[Lower])

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

Объяснение: Я добавляю желаемое значение до конца, поэтому я знаю его индекс. Затем я использую argsort, чтобы найти индексы от низкого до высокого, а затем используйте np.where, чтобы найти, где находится мое нужное значение. Затем используйте индексирование, чтобы найти верхние и нижние значения.

спросил(а) 2021-01-25T19:05:19+03:00 4 месяца, 3 недели назад
1
Решение
76

Вы можете фильтровать массив, а затем использовать np.partition:

mask = TestArray < Value
Lower, Upper = -np.partition(-TestArray[mask], 2)[:2], np.partition(TestArray[~mask], 2)[:2]

Lower
#array([19, 19])

Upper
#array([23, 32])

Чтобы вернуть индексы:

TestArray = np.array([12,42,19,32,41,14,17,23,12,18,32,19])    ​

mask = TestArray < Value
arrInd = np.column_stack((np.arange(len(TestArray)), TestArray))
Lower, Upper = arrInd[mask,:], arrInd[~mask,:]
LowerInd, UpperInd = np.argpartition(-Lower[:, 1], 2)[:2], np.argpartition(Upper[:,1], 2)[:2]

print(Lower[LowerInd])
​#[[ 2 19]
# [11 19]]

print(Upper[UpperInd])
#[[ 7 23]
# [ 3 32]]

ответил(а) 2021-01-25T19:05:19+03:00 4 месяца, 3 недели назад
45

Я думаю, что np.searchsorted может вам пригодиться.

Вот пример из документации

>>> np.searchsorted([1,2,3,4,5], 3)
2

ответил(а) 2021-01-25T19:05:19+03:00 4 месяца, 3 недели назад
45

Решения numpy, вероятно, лучший способ пойти. Для сравнения, это несколько эффективное решение с использованием heapq.nsmallest():

>>> from heapq import nsmallest
>>> data = [12,42,19,32,41,14,17,23,12,18,32,19]
>>> nsmallest(2, data, key=lambda x: (x-20 if x >= 20 else float('inf')))
[23, 32]
>>> nsmallest(2, data, key=lambda x: (20-x if x <= 20 else float('inf')))
[19, 19]

ответил(а) 2021-01-25T19:05:19+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема