Числовой эквивалент списка. index

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

18
задан lothario 24 February 2011 в 15:26
поделиться