我有兩個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]
我有兩個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]
因爲你的問題是唯一有意義的,如果數組是有序的,你可以找到一個二進制搜索交叉點對於大陣列來說要快得多:
# 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」。
如果你正在尋找的方程的解˚F(X)= F (X),你也可以這樣做:
np.argmin(abs(f2-f1))
# 1300
,並獲得x
有,當然
x[np.argmin(abs(f2-f1))]
# 3.0
但請注意,這樣只會有時給出相同的答案,你在技術上要求(在本例返回i0 --> 1301
和x0 --> 3.01
(這是解決方案加上步驟x
)。
這幾乎是在NumPy中這樣做的方式。對於非常大的數組,早期停止的Cython版本會更快。 – 2013-03-22 17:06:48
看起來不錯。類似的解決方案是'np.where(f2> f1)[0] [0]'。 – Evert 2013-03-22 17:06:56
或者,'np.argmax(f2> f1)'返回第一個出現'True'的索引,最後沒有那個討厭的[0] [0]'。但它基本上是一樣的。 – Jaime 2013-03-22 17:29:15