2013-03-22 50 views
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] 
+0

這幾乎是在NumPy中這樣做的方式。對於非常大的數組,早期停止的Cython版本會更快。 – 2013-03-22 17:06:48

+1

看起來不錯。類似的解決方案是'np.where(f2> f1)[0] [0]'。 – Evert 2013-03-22 17:06:56

+3

或者,'np.argmax(f2> f1)'返回第一個出現'True'的索引,最後沒有那個討厭的[0] [0]'。但它基本上是一樣的。 – Jaime 2013-03-22 17:29:15

回答

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」。

0

如果你正在尋找的方程的解˚F(X)= F (X),你也可以這樣做:

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

,並獲得x有,當然

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

但請注意,這樣只會有時給出相同的答案,你在技術上要求(在本例返回i0 --> 1301x0 --> 3.01(這是解決方案加上步驟x)。

相關問題