我需要找到满足条件的 1d NumPy 数组或 Pandas 数字系列中第一个值的索引。数组很大,索引可能靠近数组的开头或结尾,或者根本不满足条件。我无法提前判断哪个更有可能。如果不满足条件,则返回值应为-1。我考虑了几种方法。
# func(arr) returns a Boolean array
idx = next(iter(np.where(func(arr))[0]), -1)
Run Code Online (Sandbox Code Playgroud)
但这通常太慢了,因为func(arr)在整个数组上应用向量化函数而不是在满足条件时停止。具体来说,当条件在数组开始附近满足时,代价是昂贵的。
np.argmax稍微快一点,但无法识别何时从未满足条件:
np.random.seed(0)
arr = np.random.rand(10**7)
assert next(iter(np.where(arr > 0.999999)[0]), -1) == np.argmax(arr > 0.999999)
%timeit next(iter(np.where(arr > 0.999999)[0]), -1) # 21.2 ms
%timeit np.argmax(arr > 0.999999) # 17.7 ms
Run Code Online (Sandbox Code Playgroud)
np.argmax(arr > 1.0)返回0,当条件,即一个实例并不满足。
# func(arr) returns a Boolean …Run Code Online (Sandbox Code Playgroud)