2 つの 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 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
)。