Comment parviennent-ils en interne à ce que vous puissiez passer quelque chose comme x> 5 dans une méthode?
La réponse courte est que non.
Toute sorte d'opération logique sur un tableau numpy renvoie un tableau booléen. (c'est-à __gt__
- dire __lt__
,, etc. tous renvoient des tableaux booléens où la condition donnée est vraie).
Par exemple
x = np.arange(9).reshape(3,3)
print x > 5
donne:
array([[False, False, False],
[False, False, False],
[ True, True, True]], dtype=bool)
C'est la même raison pour laquelle quelque chose comme if x > 5:
lève une ValueError si x
est un tableau numpy. C'est un tableau de valeurs True / False, pas une seule valeur.
De plus, les tableaux numpy peuvent être indexés par des tableaux booléens. Par exemple, les x[x>5]
rendements [6 7 8]
, dans ce cas.
Honnêtement, il est assez rare que vous en ayez réellement besoin, numpy.where
mais cela renvoie simplement les indications où se trouve un tableau booléen True
. Vous pouvez généralement faire ce dont vous avez besoin avec une simple indexation booléenne.
numpy.where
y a 2 `` modes de fonctionnement '', le premier retourne les paramètres optionnelsindices
, wherecondition is True
et ifx
ety
sont présents (même forme quecondition
, ou diffusables à une telle forme!), Il retournera des valeurs dex
quandcondition is True
autrementy
. Cela le rend doncwhere
plus polyvalent et lui permet d'être utilisé plus souvent. Merci__getitem__
syntaxe[]
over soitnumpy.where
ounumpy.take
. Étant donné qu'il__getitem__
doit également prendre en charge le découpage, il y a des frais généraux. J'ai constaté des différences de vitesse notables lors de l'utilisation des structures de données Python Pandas et de l'indexation logique de très grandes colonnes. Dans ces cas, si vous n'avez pas besoin de trancher, alorstake
etwhere
c'est mieux.Old Answer, c'est un peu déroutant. Il vous donne les LIEUX (tous) où votre déclaration est vraie.
alors:
Je l'utilise comme alternative à list.index (), mais il a également de nombreuses autres utilisations. Je ne l'ai jamais utilisé avec des tableaux 2D.
http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html
Nouvelle réponse Il semble que la personne demandait quelque chose de plus fondamental.
La question était de savoir comment vous pourriez implémenter quelque chose qui permet à une fonction (comme où) de savoir ce qui a été demandé.
Notez tout d'abord qu'appeler l'un des opérateurs de comparaison fait une chose intéressante.
Cela se fait en surchargeant la méthode "__gt__". Par exemple:
Comme vous pouvez le voir, "a> 4" était un code valide.
Vous pouvez obtenir une liste complète et une documentation de toutes les fonctions surchargées ici: http://docs.python.org/reference/datamodel.html
Ce qui est incroyable, c'est à quel point il est simple de le faire. TOUTES les opérations en python sont effectuées de cette manière. Dire a> b équivaut à a. gt (b)!
la source
np.where(a > 30 and a < 50)
ounp.where(30 < a < 50)
parce qu'elle finit par essayer d'évaluer le ET logique de deux tableaux de booléens, ce qui n'a pas de sens. Existe-t-il un moyen d'écrire une telle condition avecnp.where
?np.where((a > 30) & (a < 50))
np.where
renvoie un tuple de longueur égale à la dimension du ndarray numpy sur lequel il est appelé (en d'autres termesndim
) et chaque élément du tuple est un ndarray numpy d'indices de toutes ces valeurs dans le ndarray initial pour lequel la condition est True. (Veuillez ne pas confondre dimension avec forme)Par exemple:
y est un tuple de longueur 2 parce qu'il
x.ndim
est 2. Le premier élément du tuple contient les numéros de ligne de tous les éléments supérieurs à 4 et le deuxième élément contient les numéros de colonne de tous les éléments supérieurs à 4. Comme vous pouvez le voir, [1,2,2 , 2] correspond aux numéros de ligne de 5,6,7,8 et [2,0,1,2] correspond aux numéros de colonne de 5,6,7,8. Notez que le ndarray est parcouru le long de la première dimension (en ligne ).De même,
renverra un tuple de longueur 3 car x a 3 dimensions.
Mais attendez, il y a plus à np.where!
lorsque deux arguments supplémentaires sont ajoutés
np.where
; il effectuera une opération de remplacement pour toutes ces combinaisons ligne-colonne par paires qui sont obtenues par le tuple ci-dessus.la source