Sei 0 & lt; = x & lt; = 1. Ich habe zwei Spalten f und g der Länge 5000 jeweils. Jetzt plane ich:
%Vor%Ich möchte den Punkt 'x' finden, wo die Kurve sich schneidet. Ich möchte nicht die Schnittmenge von f und g finden. Ich kann es einfach mit:
%Vor% Sie können np.sign
in Kombination mit np.diff
und np.argwhere
verwenden, um die Indizes von Punkten zu erhalten, an denen sich die Linien kreuzen (in diesem Fall sind die Punkte [ 0, 149, 331, 448, 664, 743]
):
Zuerst berechnet es f - g
und die entsprechenden Vorzeichen mit np.sign
. Durch Anwenden von np.diff
werden alle Positionen angezeigt, an denen sich das Vorzeichen ändert (z. B. die Linien kreuzen sich). Die Verwendung von np.argwhere
gibt uns die genauen Indizes.
Auch wenn f und g sich schneiden, kann man nicht sicher sein, dass f [i] == g [i] für die ganze Zahl i (der Schnittpunkt tritt wahrscheinlich zwischen Punkten auf).
Sie sollten stattdessen wie
testen %Vor%Für die Arrays f und g könnten wir einfach folgendes tun:
%Vor%Dies ergibt die Matrix aller Kreuzungspunkte. Jede 1 ist ein Crossover von unten nach oben und jeder -1 ein Crossover von oben nach unten.
Es kann mehrere Schnittpunkte geben, Sie können den Punkt (x,y)
an jeder Kreuzung durch das folgende Listenverständnis finden
Als einfaches Beispiel
%Vor% Es wurde also ein Schnittpunkt bei x = 3, y = 6
gefunden. Beachten Sie, dass wenn Sie float
verwenden, die beiden Werte möglicherweise nicht exakt gleich sind, sodass Sie eine Toleranz anstelle von ==
verwenden können.
Der Schnitt erfolgt wahrscheinlich zwischen Punkten. Sehen wir uns das Beispiel unten an.
%Vor% Zeichnen Sie die 2 obigen Kurven zusammen mit ihren Schnittpunkten und verwenden Sie als Schnittpunkt die Durchschnittskoordinaten vor und nach dem Vorschlag von idx
Schnittpunkt, alle Punkte sind näher an der ersten Kurve .
verwendet als Schnittpunkt die Durchschnittskoordinaten vor und nach, aber für beide y1- und y2-Kurven sind sie normalerweise näher am wahren Schnittpunkt
%Vor%Für eine noch genauere Schnittpunktschätzung könnten wir Interpolation verwenden.
Tags und Links python matplotlib