在多次调用的低级函数中,我需要执行与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
不是一个选项,因为它总是遍历整个数组。一旦找到第一个索引,我需要停止的东西。编辑:与该问题有关的一些更具体的信息。
np.where
的调用是瓶颈,至少占总运行时间的50%。 ValueError
并不是必须的;它只需要返回一些明显表明该值不在数组中的值即可。 如建议的那样,我可能会在Cython中编写解决方案。
最佳答案
请参阅我对OP的警告的评论,但总的来说,我会执行以下操作:
import numpy as np
a = np.array([1, 2, 3])
np.min(np.nonzero(a == 2)[0])
如果您要查找的值不在数组中,则由于以下原因,您将获得
ValueError
:ValueError: zero-size array to ufunc.reduce without identity
因为您正在尝试获取空数组的最小值。
我将分析此代码,看看它是否是一个实际的瓶颈,因为通常当numpy使用内置函数而不是显式python循环搜索整个数组时,它相对较快。在发现第一个值时坚持停止搜索可能在功能上不相关。