在一个被多次调用的底层函数中,我需要使用numpy数组来实现类似于Python中list.index的功能。该函数需要在找到第一个值时返回该值,并在未找到目标值时抛出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中编写解决方案。
ValueError
。如果你想避免使用python循环,我建议你在cython
中编写自己的函数,这应该会很快并且正好做你想要的事情。我也同意你应该分析你的代码,并查看使用nonzero
或where
再找到min
索引是否真正成为了代码的瓶颈。相反,如果你多次调用该函数,问题可能在于你需要弄清楚是否可以使用numpy来避免多次调用,因为单个数组操作可能就足够了。 - JoshAdelnumpy
中使用where
或者在matlab
中使用find
遇到过任何严重的性能问题。(尽管仅仅使用一些普通的逻辑索引
就足够解决问题) 除非你拟定一个非常具体的解决方案(适用于你的情况),否则我不会期望从cython
中获得任何主要改进。然而,请确保向我们展示您当前存在的瓶颈代码?谢谢。 - eat