Der beste Weg in Ihrem speziellen Fall wäre, Ihre beiden Kriterien in ein Kriterium zu ändern:
dists[abs(dists - r - dr/2.) <= dr/2.]
Es wird nur ein boolesches Array erstellt, und meiner Meinung nach ist es leichter zu lesen, da es besagt, dass es distinnerhalb eines droder r? (Obwohl ich neu definieren würde r, das Zentrum Ihrer Interessenregion zu sein, anstatt am Anfang, also r = r + dr/2.) Aber das beantwortet Ihre Frage nicht.
Die Antwort auf Ihre Frage:
Sie brauchen nicht wirklich, wherewenn Sie nur versuchen, die Elemente herauszufiltern dists, die nicht Ihren Kriterien entsprechen:
dists[(dists >= r) & (dists <= r+dr)]
Weil das &Ihnen ein Element gibt and(die Klammern sind notwendig).
Oder wenn Sie whereaus irgendeinem Grund verwenden möchten , können Sie Folgendes tun:
dists[(np.where((dists >= r) & (dists <= r + dr)))]
Warum:
Der Grund, warum es nicht funktioniert, ist, dass np.whereeine Liste von Indizes zurückgegeben wird, kein boolesches Array. Sie versuchen, andzwischen zwei Zahlenlisten zu gelangen , die natürlich nicht die erwarteten True/ False-Werte haben . Wenn aund bbeide TrueWerte sind, wird a and bzurückgegeben b. Wenn Sie also so etwas sagen [0,1,2] and [2,3,4], erhalten Sie nur etwas [2,3,4]. Hier ist es in Aktion:
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]),)
Was Sie erwartet hatten, um zu vergleichen, war zum Beispiel einfach das boolesche Array
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)
Jetzt können Sie np.wheredas kombinierte boolesche Array aufrufen :
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. ])
Oder indizieren Sie einfach das ursprüngliche Array mit dem booleschen Array mithilfe einer ausgefallenen Indizierung
In [241]: dists[(dists >= r) & (dists <= r + dr)]
Out[241]: array([ 5. , 5.5, 6. ])
()um(ar>3)und(ar>6)?