Y a-t-il une fonction intégrée dans Python3 / Numpy qui filtre une matrice et renvoie des indices des éléments qui sont laissés? Quelque chose de similaire à numpy.argsort pour le tri. Le filtre que j'ai définit à la fois des seuils min et max - toutes les valeurs ci-dessous / ci-dessus min / max doivent être filtrées.
J'ai vu la fonction de Python Filtre , mais je ne vois pas un moyen d'extraire des indices en l'utilisant. p>
édité: beaucoup d'informations utiles dans les réponses, merci! p> Comme @svenmarnach a souligné, le masque est suffisant: p> mask = (min_value < a) & (a < max_value)
5 Réponses :
Vous pouvez obtenir les indices des éléments dans le tableau un dimensionnel Habituellement, vous n'avez pas besoin de ces indices, mais vous pouvez travailler plus efficacement avec le masque P> A code> supérieur à
min_value code> et les que
max_value code> avec XXX PRE>
b[mask]
Super! Merci pour une réponse rapide. En effet, le masque est suffisant - mais comment puis-je appliquer ce masque à un autre éventail de la même forme que «A»?
@Katya qu'est-ce que cela signifierait? Si vous aviez une matrice 5x5 avec un masque particulier, pourriez-vous définir ce que cela signifierait appliquer sur un tableau 4x3 ou 6x6?
@Katya: Que voulez-vous dire par "appliquer ce masque"? Extraire les éléments correspondants? J'ai ajouté une phrase à ma réponse à cette fin.
@Hooked, en appliquant un masque, je veux dire exactement "extraire les éléments de B correspondant aux véritables entrées dans le masque" et la solution proposée B [masque] fonctionne. J'ai effectivement essayé que, pour une raison quelconque, j'ai utilisé un vecteur de 0 et 1S (la sortie de l'impression (masque)), et non le masque d'origine avec des valeurs vraies et fausses - qui donne un mauvais résultat. Merci encore, problème résolu!
La commande donne: p> un exemple plus compliqué: p> donne: p> Je suis d'accord avec @svenmarnach, généralement, vous ne besoin em> les indices. P> P> numpy.where code> retournera les indices d'un tableau après avoir appliqué un masque sur eux. Par exemple:
Je venais de créer ma propre version de où code> quand j'ai vu cela. Soupir.
@senderle Il est probablement plus lent aussi. Chaque fois que je pense connaître la pleine puissance de numpy / scipy code>, ce site me montre que je me trompe.
J'aime Réponse de Sven à la réponse de Sven, et en fait, par exemple: p> Numpy.where code>
fait exactement ce que vous voulez, comme l'a raccourci. Mais surtout parce que je l'ai déjà écrit, voici une autre approche, juste pour illustrer quelques astuces. my_filter code> peut être n'importe quelle fonction renvoyer une matrice booléenne de la même forme que l'entrée:
>>> a = numpy.arange(100).reshape((10, 10))
>>> def my_filter(a):
... return (min_value < a) & (a < max_value)
...
>>> a_mask = my_filter(a)
>>> [ind[a_mask] for ind in numpy.indices(a.shape)]
[array([1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3]),
array([1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3,
4, 5, 6, 7, 8, 9])]
non directement liée à votre question, mais La fonctionnalité de filtre () code> fait partie d'un ensemble de trois fonctions,
mappe () code>,
filtre () code >, et
réduire () code>, qui permettent le traitement de la liste de type fonctionnel en python. P>
map (mapping_function, INPUT_LIST) code> prend une fonction d'un argument et d'une liste, applique la fonction à chaque élément de la liste à tour de rôle et renvoie une liste de sortie comme résultat . C'est plus ou moins équivalent à la compréhension de la liste
[mapping_function (élément) pour l'élément dans INPUT_LIST] CODE>. P> LI>
filtre (filtre_function, INPUT_LIST) code> renvoie une liste d'éléments de
INPUT_LIST code> pour lequel le
filtre_function code> renvoyé
vrai < / code>. L'équivalent de compréhension de la liste est
[élément pour l'élément dans les éléments si filtrant_function (élément)] code>. P> li>
Réduire (combinant_function, INPUT_LIST) CODE> combine à plusieurs reprises des paires d'éléments adjacents dans la liste d'entrée jusqu'à ce que la seule valeur soit laissée. Par exemple, la somme d'une liste de nombres pourrait être exprimée en tant que
réduire (opérateur.add, chiffres) code>. P> li>
ul>
mappe () code> et
filtre () code> est fourni par des compréhensions de liste dans Python (c'est pourquoi la carte
carte code> et
et
et
Filtre CODE> Les fonctions ne sont pas utilisées très souvent.) P>
réduire () code> est l'une de ces choses qui ne se suggère pas comme une réponse intuitive à ... n'importe quoi. Il est presque toujours plus clair d'écrire une boucle, ce qui explique pourquoi vous ne le voyez pas souvent. P>
Vous n'avez pas nécessairement besoin de numpopie, vous pouvez le faire avec une compréhension de liste simple et retourne: p> < Code> [2, 3] code> p> p> énumérer code>:
Il devrait être [i pour i, v en énumérable (a) si v> 2] code> mais oui .. Cette approche fonctionne. tnx suzana :)