Suche in Numpy
Ich habe die aufsteigende Zahl sortiert, wenn Sie abs (arr) im folgenden Code ausführen. Ich versuche, nach einem Index zu suchen, bei dem das Vorzeichen von negativ auf positiv geändert wurde. Schrieb diesen folgenden Code, aber aus einigen Gründen glaube ich, dass wir ihn verbessern oder weiter optimieren können. Irgendwelche Tipps und Tricks?
import numpy as np
arr = np.array([-1,-2,-3, 4, 5, 6])
_cut_index_1 = np.where(arr > 0)[0][0]
_cut_index_2 = np.where(arr < 0)[0][-1]
arr[_cut_index_1] # output: 4
arr[_cut_index_2] # output: -3
Antworten
Ihre aktuelle Lösung führt zwei Durchgänge über das Eingabearray (die beiden Aufrufe von np.where) durch, was, wie angegeben, verschwenderisch erscheint. Eine einfache Möglichkeit, das Problem zu lösen, besteht darin, np.argmaxeine lineare Zeit zu verwenden:
import numpy as np
arr = np.array([-1, -2, -3, 4, 5, 6])
np.argmax(arr > 0) # Return (index) 3
Wenn wir an diesem Punkt annehmen können (wie Sie zu implizieren scheinen), dass es eine einzige interessierende Position gibt (und / oder dass wir uns nur um die erste kümmern, die von links nach rechts gelesen wird), sind wir fertig: Dekrementieren Sie einfach eine von die Antwort und Sie haben den anderen Grenzwert (aber prüfen Sie, ob wir uns in einem Eckfall befinden, um keinen ungültigen Index zurückzugeben).
Wenn Sie jedoch davon ausgehen können, dass die Eingabe sortiert ist, können Sie einen linearen Scan vermeiden und nicht einmal die gesamte Eingabe lesen. Dazu können Sie eine binäre Suche über searchsorted durchführen . Theoretisch ist dies schneller (dh im schlimmsten Fall logarithmisch oder linear), in der Praxis hängt dies jedoch von der Größe des Arrays ab. Das heißt, für ausreichend kleine Arrays ist ein linearer Scan aufgrund der Cache-Lokalität schneller (oder zumindest sollte dies modulo für Ihre Hardwaredetails der Fall sein).