Cách tốt nhất trong trường hợp cụ thể của bạn chỉ là thay đổi hai tiêu chí của bạn thành một tiêu chí:
dists[abs(dists - r - dr/2.) <= dr/2.]
Nó chỉ tạo ra một mảng boolean, và theo ý kiến của tôi là dễ đọc hơn vì nó nói, là dist
trong vòng một dr
hoặc r
? (Mặc dù tôi xác định lại r
là trung tâm của khu vực bạn quan tâm thay vì bắt đầu, vì vậy r = r + dr/2.
) Nhưng điều đó không trả lời câu hỏi của bạn.
Câu trả lời cho câu hỏi của bạn:
Bạn thực sự không cần where
nếu bạn chỉ cố gắng lọc ra các yếu tố dists
không phù hợp với tiêu chí của bạn:
dists[(dists >= r) & (dists <= r+dr)]
Bởi vì ý &
chí sẽ cho bạn một yếu tố and
(dấu ngoặc đơn là cần thiết).
Hoặc, nếu bạn muốn sử dụng where
vì một số lý do, bạn có thể làm:
dists[(np.where((dists >= r) & (dists <= r + dr)))]
Tại sao:
Lý do nó không hoạt động là vì np.where
trả về một danh sách các chỉ mục, không phải là một mảng boolean. Bạn đang cố gắng để có được and
giữa hai danh sách các số, tất nhiên không có True
/ False
giá trị mà bạn mong đợi. Nếu a
và b
là cả hai True
giá trị, sau đó a and b
trả về b
. Vì vậy, nói một cái gì đó như [0,1,2] and [2,3,4]
sẽ chỉ cung cấp cho bạn [2,3,4]
. Đây là hành động:
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]),)
Những gì bạn đang mong đợi để so sánh chỉ đơn giản là mảng boolean, ví dụ
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)
Bây giờ bạn có thể gọi np.where
trên mảng boolean kết hợp:
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. ])
Hoặc chỉ đơn giản là lập chỉ mục mảng ban đầu với mảng boolean bằng cách lập chỉ mục ưa thích
In [241]: dists[(dists >= r) & (dists <= r + dr)]
Out[241]: array([ 5. , 5.5, 6. ])
()
xung quanh(ar>3)
và(ar>6)
?