7
votes

Filtrer un tableau dans les indices Python3 / Numpy et de retour

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)


0 commentaires

5 Réponses :


6
votes

Vous pouvez obtenir les indices des éléments dans le tableau un dimensionnel A code> supérieur à min_value code> et les que max_value code> avec XXX PRE>

Habituellement, vous n'avez pas besoin de ces indices, mais vous pouvez travailler plus efficacement avec le masque P>

b[mask]


4 commentaires

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!



8
votes

La commande numpy.where retournera les indices d'un tableau après avoir appliqué un masque sur eux. Par exemple: xxx

donne: xxx

un exemple plus compliqué: xxx

donne: xxx

Je suis d'accord avec @svenmarnach, généralement, vous ne besoin les indices.


2 commentaires

Je venais de créer ma propre version de 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 , ce site me montre que je me trompe.



1
votes

J'aime Réponse de Sven à la réponse de Sven, et en fait, 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: xxx pré>

par exemple: p>

>>> 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])]


0 commentaires

3
votes

non directement liée à votre question, mais filtre () fait partie d'un ensemble de trois fonctions, mappe () , filtre () , et réduire () , qui permettent le traitement de la liste de type fonctionnel en python.

  • map (mapping_function, INPUT_LIST) 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] .

  • filtre (filtre_function, INPUT_LIST) renvoie une liste d'éléments de INPUT_LIST pour lequel le filtre_function 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)] .

  • Réduire (combinant_function, INPUT_LIST) 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) .

    La fonctionnalité de mappe () et filtre () est fourni par des compréhensions de liste dans Python (c'est pourquoi la carte carte et et et Filtre Les fonctions ne sont pas utilisées très souvent.)

    réduire () 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.


0 commentaires

0
votes

Vous n'avez pas nécessairement besoin de numpopie, vous pouvez le faire avec une compréhension de liste simple et énumérer : xxx

retourne:

< Code> [2, 3]


1 commentaires

Il devrait être [i pour i, v en énumérable (a) si v> 2] mais oui .. Cette approche fonctionne. tnx suzana :)