В низкоуровневой функции, которая вызывается много раз, мне нужно сделать эквивалент списка python list.index, но с пустым массивом. Функция должна вернуться, когда найдет первое значение, и вызвать ValueError в противном случае. Что-то вроде:
>>> a = np.array([1, 2, 3])
>>> np_index(a, 1)
0
>>> np_index(a, 10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 10 not in array
Я хочу по возможности избежать цикла Python. np.where
не вариант, так как он всегда перебирает весь массив; Мне нужно что-то, что останавливается, когда найден первый индекс.
РЕДАКТИРОВАТЬ : Некоторая более конкретная информация, связанная с проблемой.
Примерно в 90% случаев искомый индекс находится в первых от 1/4 до 1/2 массива. Таким образом, на карту поставлено ускорение в 2-4 раза. Остальные 10% времени значение вообще отсутствует в массиве.
Я уже что-то профилировал, и вызов np.where
является узким местом, занимая как минимум 50% от общего времени выполнения.
Не обязательно, чтобы он поднял ValueError
; он просто должен возвращать что-то, что явно указывает на то, что значение отсутствует в массиве.
Я, вероятно, напишу код решения в Cython, как было предложено.