我有两个 numpy 数组,我想找到一个数组中的数据变得大于另一个的索引。以下代码似乎可以解决问题,但我想知道是否有更好的方法:
# For example
import numpy as np
x=np.arange(-10,10,0.01)
f1 = x+3.0
f2 = 2*x
cross_over_index = np.nonzero(f2 > f1)[0][0]
如果您正在寻找方程f 1 (x) = f 2 (x)的解,您也可以这样做:
np.argmin(abs(f2-f1))
# 1300
并到达x
那里,当然
x[np.argmin(abs(f2-f1))]
# 3.0
但请注意,这有时只会给出与您在技术上要求的答案相同的答案(在此示例中返回i0 --> 1301
和x0 --> 3.01
(这是解决方案加上 的步长x
)。
因为您的问题只有在数组有序时才有意义,所以您可以使用二进制搜索找到交叉点,这对于大型数组来说会快得多:
# Find first index of a2 > a1
def crossover(a1, a2):
bottom = 0
top = min(len(a1) - 1, len(a2) - 1)
if a2[top] <= a1[top]:
return -1
while top > bottom:
mid = (top + bottom) >> 1
if a2[mid] > a1[mid]:
top = mid
else:
bottom = mid + 1
return top
f1 = [ (x + 20) for x in range(80) ]
f2 = [ (2 * x) for x in range(100) ]
print( crossover( f1, f2 ) )
这应该(并且确实)打印“21”。