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á dist
dentro de un dr
o r
? (Aunque me redefiniría r
para 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 where
si solo está tratando de filtrar los elementos dists
que 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 where
por 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.where
devuelve una lista de índices, no una matriz booleana. Estás tratando de obtener and
entre dos listas de números, que por supuesto no tienen los valores True
/ False
que esperas. Si a
y b
son ambos True
valores, entonces a and b
regresa 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.where
a 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)
?Me gusta usar
np.vectorize
para tales tareas. Considera lo siguiente:También puede usar en
np.argwhere
lugar denp.where
para una salida clara. Pero esa es tu decisión :)Espero eso ayude.
fuente
Tratar:
fuente
Esto debería funcionar:
La forma más elegante ~~
fuente
Tratar:
Salida: (matriz ([2, 3]),)
Puede ver las funciones lógicas para más detalles.
fuente
He resuelto este simple ejemplo.
fuente