Der beste Weg, in Ihrem speziellen Fall würde nur Ihre zwei Kriterien ein Kriterium zu ändern sein:
dists[abs(dists - r - dr/2.) <= dr/2.]
Es schafft nur ein boolean-Array, und meiner Meinung nach ist einfacher zu lesen, weil es sagt, ist dist
innerhalb einer dr
oder r
? (Obwohl ich r
definieren würde, um das Zentrum Ihrer Region von Interesse statt des Anfangs zu sein, also r = r + dr/2.
) Aber das beantwortet Ihre Frage nicht.
Die Antwort auf Ihre Frage:
Sie eigentlich nicht where
brauchen, wenn Sie nur versuchen, die Elemente von dists
, um herauszufiltern, die nicht Ihren Kriterien passen:
dists[(dists >= r) & (dists <= r+dr)]
Weil die &
Ihnen eine elementweise and
geben wird (die Klammern sind notwendig).
Oder, wenn Sie where
aus irgendeinem Grund verwenden möchten, können Sie tun:
dists[(np.where((dists >= r) & (dists <= r + dr)))]
Warum:
Der Grund es nicht funktioniert, weil np.where
eine Liste zurückgibt von Indizes, kein boolesches Array. Sie versuchen, and
zwischen zwei Listen von Zahlen zu bekommen, die natürlich nicht die Werte haben, die Sie erwarten. Wenn a
und b
beide True
Werte sind, dann gibt a and b
b
zurück. So etwas zu sagen wie [0,1,2] and [2,3,4]
wird nur [2,3,4]
geben.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 war einfach die boolean-Array zu vergleichen, zum Beispiel
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.where
auf den kombinierten boolean Array nennen:
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 unter Verwendung von fancy indexing
In diesem Fall muss nicht iteriert werden. NumPy hat boolesche Indizierung. – M456