Supposons que j'ai un tableau numpy x = [5, 2, 3, 1, 4, 5]
, y = ['f', 'o', 'o', 'b', 'a', 'r']
. Je souhaite sélectionner les éléments y
correspondant aux éléments x
supérieurs à 1 et inférieurs à 5.
j'ai essayé
x = array([5, 2, 3, 1, 4, 5])
y = array(['f','o','o','b','a','r'])
output = y[x > 1 & x < 5] # desired output is ['o','o','a']
mais cela ne fonctionne pas. Comment ferais-je cela?
&
a une priorité plus élevée que<
et>
, qui à son tour ont une priorité plus élevée que (logique)and
.x > 1 and x < 5
évite d'abord les inégalités, puis la conjonction logique;x > 1 & x < 5
évalue la conjonction au niveau du bit de1
et (les valeurs dans)x
, puis les inégalités.(x > 1) & (x < 5)
force les inégalités à évaluer en premier, de sorte que toutes les opérations se produisent dans l'ordre prévu et les résultats sont tous bien définis. Consultez la documentation ici.(0 < x) & (x < 10)
(comme indiqué dans la réponse) au lieu de0 < x < 10
ce qui ne fonctionne pas pour les tableaux numpy sur aucune version de Python.IMO OP ne veut pas réellement
np.bitwise_and()
(aka&
) mais veut réellementnp.logical_and()
parce qu'ils comparent des valeurs logiques telles queTrue
etFalse
- voir ce message SO sur logique vs bit à bit pour voir la différence.Et une façon équivalente de le faire est
np.all()
de définir l'axis
argument de manière appropriée.par les chiffres:
donc l'utilisation
np.all()
est plus lente, mais&
etlogical_and
sont à peu près les mêmes.la source
output = y[np.logical_and(x > 1, x < 5)]
,x < 5
est évalué (créant éventuellement un énorme tableau), même si c'est le deuxième argument, car cette évaluation se produit en dehors de la fonction. IOW,logical_and
obtient passé deux arguments déjà évalués. Ceci est différent du cas habituel dea and b
, dans lequelb
n'est pas évalué sia
est vrai.Ajoutez un détail aux réponses de @JF Sebastian et @Mark Mikofski:
Si l'on veut obtenir les indices correspondants (plutôt que les valeurs réelles du tableau), le code suivant fera l'affaire:
Pour satisfaire plusieurs (toutes) conditions:
Pour satisfaire plusieurs (ou) conditions:
la source
(the array of indices you want,)
vous devrezselect_indices = np.where(...)[0]
donc obtenir le résultat souhaité et attendez.J'aime utiliser
np.vectorize
pour de telles tâches. Considérer ce qui suit:L'avantage est que vous pouvez ajouter beaucoup plus de types de contraintes dans la fonction vectorisée.
J'espère que ça aide.
la source
En fait, je le ferais de cette façon:
L1 est la liste d'index des éléments satisfaisant la condition 1; (peut-être que vous pouvez utiliser
somelist.index(condition1)
ounp.where(condition1)
pour obtenir L1.)De même, vous obtenez L2, une liste d'éléments satisfaisant la condition 2;
Ensuite, vous trouvez l'intersection en utilisant
intersect(L1,L2)
.Vous pouvez également trouver l'intersection de plusieurs listes si vous obtenez plusieurs conditions à satisfaire.
Ensuite, vous pouvez appliquer l'index dans n'importe quel autre tableau, par exemple, x.
la source
Pour les tableaux 2D, vous pouvez le faire. Créez un masque 2D en utilisant la condition. Convertissez le masque de condition en int ou float, selon le tableau, et multipliez-le par le tableau d'origine.
la source