Le meilleur moyen de votre cas particulier serait juste 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
o 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'avez pas vraiment besoin where
si vous essayez juste de filtrer les éléments de dists
qui ne correspondent pas à vos critères :
dists[(dists >= r) & (dists <= r+dr)]
Parce que le &
vous donnera un élément and
(les parenthèses sont nécessaires).
Ou, si vous voulez utiliser where
pour une raison quelconque, vous pouvez le faire :
dists[(np.where((dists >= r) & (dists <= r + dr)))]
Pourquoi ?
La raison pour laquelle ça ne marche pas est que np.where
renvoie une liste d'indices, et non un tableau de booléens. Vous essayez d'obtenir and
entre deux listes de nombres, ce qui bien sûr n'a pas l'avantage True
/ False
les valeurs que vous attendez. Si a
y b
sont tous deux True
valeurs, alors a and b
renvoie à b
. Donc dire quelque chose comme [0,1,2] and [2,3,4]
vous donnera juste [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
sur 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 simplement indexer le tableau original avec le tableau de booléens en utilisant indexation fantaisiste
In [241]: dists[(dists >= r) & (dists <= r + dr)]
Out[241]: array([ 5. , 5.5, 6. ])