найдите наибольшее значение ниже определенного значения в длинном векторе в python

#python #vector #max #min

#python #вектор #макс #мин

Вопрос:

Привет, у меня очень длинный вектор numpy (1000000 ) maxy1 , заполненный целыми числами. Вектор сортируется по возрастанию. теперь у меня также есть другое целое val число. Теперь я хочу найти наибольшее число maxy1 ниже val , что я делаю:

 idx = maxy1[np.where(maxy1 < val)[0][-1]]
 

но это слишком медленно, мне приходится повторять эту операцию 10000 раз, и это занимает 94% времени выполнения. есть идеи, как сделать это быстрее?

Ответ №1:

Для такого рода задач я предлагаю вам использовать np.searchsorted:

 import numpy as np

# setup
maxy1 = np.array([4, 5, 6, 7, 8, 9])
val = 7

# does a binary search
res = np.searchsorted(maxy1, val)
print(maxy1[res - 1])
 

Вывод

 6
 

Из документации:

Двоичный поиск используется для поиска требуемых точек вставки.

Двоичный поиск имеет наихудшую производительность O (logN) (см. Запись в Википедии) в отличие от вашего текущего подхода, который является линейным O (N).