Когда я использую np.searchsorted
со 100 миллионами чисел в исходном примере с устаревшей NumPy версией 1.12.1 (не могу сказать о более новых версиях), это не намного быстрее, чем np.where
:
>>> import timeit
>>> timeit.timeit('np.where(((a >= min_v) & (a <= max_v)))', number=10, globals=globals())
6.685825735330582
>>> timeit.timeit('np.searchsorted(a.ravel(), [min_v, max_v])', number=10, globals=globals())
5.304438766092062
Но, несмотря на NumPy документы для searchsorted
скажем Эта функция использует тот же алгоритм, что и встроенные функции python bisect.bisect_left
и bisect.bisect_right
, последние намного быстрее:
>>> import bisect
>>> timeit.timeit('bisect.bisect_left(a.base, min_v), bisect.bisect_right(a.base, max_v)', number=10, globals=globals())
0.002058468759059906
Поэтому я бы использовал это:
idx = np.unravel_index(range(bisect.bisect_left(a.base, min_v),
bisect.bisect_right(a.base, max_v)), a.shape)