在多次调用的低级函数中,我需要执行与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中编写解决方案。

    最佳答案

    请参阅我对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循环搜索整个数组时,它相对较快。在发现第一个值时坚持停止搜索可能在功能上不相关。

    07-28 03:00
    查看更多