В функции низкого уровня, которая вызывается много раз, мне нужно выполнить эквивалент python list.index, но с массивом numpy. Функция должна вернуться, когда найдет первое значение, и в противном случае возбудить 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, как предлагалось.