La meilleure façon dans votre cas particulier serait simplement de changer vos deux critères en un seul critère:
dists[abs(dists - r - dr/2.) <= dr/2.]
Il ne crée qu'un seul tableau booléen, et à mon avis, il est plus facile à lire car il dit, est dist
dans un dr
ou r
? (Bien que je redéfinisse r
pour être le centre de votre région d'intérêt au lieu du début, donc r = r + dr/2.
) Mais cela ne répond pas à votre question.
La réponse à votre question:
vous n'en avez pas vraiment besoin where
si vous essayez simplement de filtrer les éléments dists
qui ne correspondent pas à vos critères:
dists[(dists >= r) & (dists <= r+dr)]
Parce que le &
vous donnera un élément par élémentand
(les parenthèses sont nécessaires).
Ou, si vous souhaitez utiliser where
pour une raison quelconque, vous pouvez faire:
dists[(np.where((dists >= r) & (dists <= r + dr)))]
Pourquoi:
La raison pour laquelle cela ne fonctionne pas est que np.where
renvoie une liste d'indices, pas un tableau booléen. Vous essayez de passer and
entre deux listes de nombres, qui n'ont bien sûr pas les valeurs True
/ False
que vous attendez. Si a
et b
sont les deux True
valeurs, alors a and b
renvoie b
. Donc, dire quelque chose comme ça [0,1,2] and [2,3,4]
va vous donner [2,3,4]
. Le voici en action:
In [230]: dists = np.arange(0,10,.5)
In [231]: r = 5
In [232]: dr = 1
In [233]: np.where(dists >= r)
Out[233]: (array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]),)
In [234]: np.where(dists <= r+dr)
Out[234]: (array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),)
In [235]: np.where(dists >= r) and np.where(dists <= r+dr)
Out[235]: (array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]),)
Ce que vous vous attendiez à comparer était simplement le tableau booléen, par exemple
In [236]: dists >= r
Out[236]:
array([False, False, False, False, False, False, False, False, False,
False, True, True, True, True, True, True, True, True,
True, True], dtype=bool)
In [237]: dists <= r + dr
Out[237]:
array([ True, True, True, True, True, True, True, True, True,
True, True, True, True, False, False, False, False, False,
False, False], dtype=bool)
In [238]: (dists >= r) & (dists <= r + dr)
Out[238]:
array([False, False, False, False, False, False, False, False, False,
False, True, True, True, False, False, False, False, False,
False, False], dtype=bool)
Vous pouvez maintenant appeler np.where
le tableau booléen combiné:
In [239]: np.where((dists >= r) & (dists <= r + dr))
Out[239]: (array([10, 11, 12]),)
In [240]: dists[np.where((dists >= r) & (dists <= r + dr))]
Out[240]: array([ 5. , 5.5, 6. ])
Ou indexez simplement le tableau d'origine avec le tableau booléen en utilisant une indexation sophistiquée
In [241]: dists[(dists >= r) & (dists <= r + dr)]
Out[241]: array([ 5. , 5.5, 6. ])
()
autour(ar>3)
et(ar>6)
?J'aime utiliser
np.vectorize
pour de telles tâches. Considérer ce qui suit:Vous pouvez également utiliser à la
np.argwhere
place denp.where
pour une sortie claire. Mais c'est ton appel :)J'espère que ça aide.
la source
Essayer:
la source
Cela devrait fonctionner:
La manière la plus élégante ~~
la source
Essayer:
Sortie: (array ([2, 3]),)
Vous pouvez voir les fonctions logiques pour plus de détails.
la source
J'ai élaboré cet exemple simple
la source