7
votes

Comment trouver la valeur la plus proche plus grande dans une matrice numpue?

Je voudrais obtenir l'index de la valeur la plus proche dans une matrice numpue supérieure à ma valeur de recherche. Exemple: FindNeAreAstabove (np.array ([0. 0., 1.4,2.]), 1.5) devrait renvoyer 3 (l'index de 2.).

Je sais que je peux obtenir l'index le plus proche avec np.abs (valeur a-valeur) .argmin () , et j'ai découvert que min (A. NP. -Value> = 0.) [0]]) renvoie la valeur de la matrice souhaitée. Par conséquent, np.where (A == min (A =. (NP.Where (A-Valeur> = 0.) [0]])) [0] 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?


3 commentaires

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.


4 Réponses :


-3
votes

Voici le moyen droite de faire ceci: xxx

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.


4 commentaires

En supposant que les tableaux sont triés, np.searchsorte feront cela un lot 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 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.



7
votes

Voici aller simple (je suppose qu'au plus près que vous voulez dire en termes de valeur non localisée) xxx

résultat: xxx


4 commentaires

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 . Ou y a-t-il un moyen plus efficace de résoudre ce problème?


sinon np.any (masque): retour


Merci à votre contribution, j'ai mis à jour ma réponse. Cela fonctionne correctement maintenant.



10
votes

Je pense que vous pouvez utiliser np.searchsorted < / code> pour ceci: xxx

supposer a est en ordre croissant.

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.

note : vous pouvez également utiliser np.digitize à 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 et nécessite que a soit monotonique: xxx < / pré>


3 commentaires

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é" cela ne fonctionne pas de manière opposée?



0
votes

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.): xxx

Il est facilement adapté pour le plus proche mais moins que: xxx


0 commentaires