Je voudrais obtenir l'index de la valeur la plus proche dans une matrice numpue supérieure à ma valeur de recherche. Exemple: Je sais que je peux obtenir l'index le plus proche avec FindNeAreAstabove (np.array ([0. 0., 1.4,2.]), 1.5) code> devrait renvoyer 3 (l'index de 2.). P>
np.abs (valeur a-valeur) .argmin () code>, et j'ai découvert que
min (A. NP. -Value> = 0.) [0]]) code> renvoie la valeur de la matrice souhaitée. Par conséquent,
np.where (A == min (A =. (NP.Where (A-Valeur> = 0.) [0]])) [0] code> me donnerait probablement l'index souhaité. Cependant, cela semble plutôt compliqué et je crains que cela ne se casse pas dans le cas de matrices multicensions. Toute suggestion comment améliorer cela? P>
4 Réponses :
Voici le moyen droite em> de faire ceci: Le point ici est que si une valeur correspondante existe, vous obtiendrez la réponse lorsque cette valeur est rencontré. D'autres méthodes (y compris la vôtre, proposée dans la question) inspecteront l'ensemble de la matrice, qui est une perte de temps. P> P>
En supposant que les tableaux sont i> triés, np.searchsorte code> feront cela un lot i> plus vite
@ALI_M YEAH, vous pouvez être sûr, j'ai entendu parler de la recherche binaire. Mais pourquoi pensez-vous que les matrices sont triées?
Eh bien, votre solution serait seulement i> fonctionne si les matrices sont triées
@ali_m la chose est que "le plus proche" signifie que "à gauche". Comme je l'ai mentionné dans un commentaire à la question.
Voici aller simple (je suppose qu'au plus près que vous voulez dire en termes de valeur non localisée) résultat: p>
C'est la solution la plus rapide si les tableaux ne peuvent être supposés être triés
En effet, c'est très charmant. Il n'y a qu'un seul petit problème ici: si la valeur est supérieure à la valeur de la plus grande valeur, cette fonction renvoie un index zéro. Par conséquent, on a besoin d'un contrôle supplémentaire: ind = masked_diff.argmin (); Si mon_array [ind]> = cible: ind = aucun; retourner ind code>. Ou y a-t-il un moyen plus efficace de résoudre ce problème?
sinon np.any (masque): retour code>
Merci à votre contribution, j'ai mis à jour ma réponse. Cela fonctionne correctement maintenant.
Je pense que vous pouvez utiliser supposer Cette méthode ne fonctionnera pas non plus pour Les tableaux multidimensionnels, mais je ne sais pas exactement comment ce cas d'utilisation fonctionnerait en termes de production attendue. Si vous pouviez donner un exemple de ce que vous imaginez, je pourrais peut-être adapter cela à cette fin. P> note em>: vous pouvez également utiliser np.searchsorted < / code>
pour ceci: a code> est en ordre croissant. p>
np.digitize code>
à cet effet, bien qu'il exécute un linéaire Plutôt qu'une recherche binaire, donc pour certaines tailles d'entrée, il peut être beaucoup plus lent que celui de la recherche code> et nécessite que a code> soit monotonique: p>
Merci! Cela peut s'avérer utile plus tard lorsque je traite en effet avec des tableaux de tri. Le cas d'utilisation est celui des coordonnées géographiques: Normalement, ils seraient 1 dimensions, mais vous pouvez également avoir des "grilles curvilignes", auquel cas les longitudes et les latitudes sont stockés sous forme de matrices 2D. Je dois admettre que je n'ai pas pleinement pensé à l'affaire d'utilisation de Find_Nearest_above dans ce cas. Il se peut que cela n'a pas de sens.
À partir de V1.10, "NP.Digitize est mis en œuvre en termes de NP.SearchSorted." (citant les docs). Il n'y a littéralement plus une différence entre les fonctions.
Pourquoi quand je tape côté = "laissé" code> cela ne fonctionne pas de manière opposée?
Voici une solution qui a travaillé pour moi assez bien lorsque vous trouvez la valeur et l'index du nombre le plus proche mais supérieur à un tableau (aucune promesse en termes de vitesse, etc.): Il est facilement adapté pour le plus proche mais moins que: p>
Et par "la plus proche", vous voulez dire "à gauche"?
Vos matrices sont-elles toujours triées dans l'ordre croissant?
Clarifier: "le plus proche" signifie "par valeur". Aussi: non - les tableaux ne sont pas nécessairement triés.