В низкоуровневой функции, которая называется много раз, мне нужно сделать эквивалент 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
не является вариантом, поскольку он всегда выполняет итерацию по всему массиву; Мне нужно что-то, что останавливается после обнаружения первого индекса.
EDIT. Еще одна конкретная информация, связанная с этой проблемой.
-
Примерно в 90% случаев индекс, который я ищу, находится в первых 1/4 до 1/2 массива. Так что здесь потенциально может произойти 2-4 ускорения. Остальные 10% времени не имеют значения в массиве.
-
Я уже профилировал вещи, а вызов
np.where
- это узкое место, занимающее не менее 50% общей продолжительности выполнения. -
Не важно, чтобы он поднимал
ValueError
; он просто должен вернуть что-то, что, очевидно, указывает на то, что значение не находится в массиве.
Я, вероятно, буду кодировать решение в Cython, как было предложено.