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)?Me gusta usar
np.vectorizepara tales tareas. Considera lo siguiente:También puede usar en
np.argwherelugar denp.wherepara 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