La mejor manera en su caso particular sería cambiar sus dos criterios a uno:
dists[abs(dists - r - dr/2.) <= dr/2.]
Solo crea una matriz booleana, y en mi opinión es más fácil de leer porque dice, ¿ está distdentro de un dro r? (Aunque me redefiniría rpara ser el centro de su región de interés en lugar del principio, entonces r = r + dr/2.) Pero eso no responde a su pregunta.
La respuesta a su pregunta: en
realidad no es necesario wheresi solo está tratando de filtrar los elementos distsque no se ajustan a sus criterios:
dists[(dists >= r) & (dists <= r+dr)]
Porque el &te dará un elemento and(los paréntesis son necesarios).
O, si quiere usarlo wherepor alguna razón, puede hacer:
dists[(np.where((dists >= r) & (dists <= r + dr)))]
Por qué:
la razón por la que no funciona es porque np.wheredevuelve una lista de índices, no una matriz booleana. Estás tratando de obtener andentre dos listas de números, que por supuesto no tienen los valores True/ Falseque esperas. Si ay bson ambos Truevalores, entonces a and bregresa b. Así que decir algo así [0,1,2] and [2,3,4]solo te dará [2,3,4]. Aquí está en acción:
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]),)
Lo que esperaba comparar era simplemente la matriz booleana, por ejemplo
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)
Ahora puede llamar np.wherea la matriz booleana combinada:
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. ])
O simplemente indexe la matriz original con la matriz booleana usando una indexación elegante
In [241]: dists[(dists >= r) & (dists <= r + dr)]
Out[241]: array([ 5. , 5.5, 6. ])
()alrededor(ar>3)y(ar>6)?