Recherche dans Numpy
J'ai trié le nombre croissant si vous faites abs (arr) dans le code ci-dessous, j'essaie de rechercher un index où le signe est passé de négatif à positif. J'ai écrit ce code ci-dessous, mais pour certaines raisons, je pense que nous pouvons l'améliorer ou l'optimiser davantage. Des trucs et astuces?
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
Réponses
Votre solution actuelle effectue deux passes sur le tableau d'entrée (les deux invocations de np.where) ce qui, comme indiqué, semble inutile. Un moyen simple de résoudre le problème consiste à utiliser np.argmaxce qui prendra un temps linéaire:
import numpy as np
arr = np.array([-1, -2, -3, 4, 5, 6])
np.argmax(arr > 0) # Return (index) 3
À ce stade, si nous pouvons supposer (comme vous semblez l'impliquer) qu'il y a une seule position d'intérêt (et / ou que nous ne nous soucions que de la première, lisez de gauche à droite), nous avons terminé: décrémentez simplement une de la réponse et vous avez l'autre point de coupure (mais vérifiez si nous sommes à un coin de cas pour ne pas renvoyer un index non valide).
Mais en fait, si vous pouvez supposer en toute sécurité que l'entrée est triée, vous pouvez éviter de faire un balayage linéaire et même pas lire l'entrée entière. Pour cela, vous pouvez effectuer une recherche binaire via searchsorted . Théoriquement, c'est plus rapide (c'est-à-dire, logarithmique ou linéaire dans le pire des cas) mais en pratique cela dépendra de la taille du tableau. Autrement dit, pour des tableaux suffisamment petits, une analyse linéaire sera plus rapide en raison de la localité du cache (ou, du moins, cela devrait être le cas modulo vos détails matériels).