4

我有两个 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]
4

2 回答 2

0

如果您正在寻找方程f 1 (x) = f 2 (x)的解,您也可以这样做:

np.argmin(abs(f2-f1))
# 1300

并到达x那里,当然

x[np.argmin(abs(f2-f1))]
# 3.0

但请注意,这有时只会给出与您在技术上要求的答案相同的答案(在此示例中返回i0 --> 1301x0 --> 3.01(这是解决方案加上 的步长x)。

于 2013-03-28T23:54:18.237 回答
0

因为您的问题只有在数组有序时才有意义,所以您可以使用二进制搜索找到交叉点,这对于大型数组来说会快得多:

# 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”。

于 2013-03-28T21:59:09.503 回答