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à disttrong vòng một drhoặc r? (Mặc dù tôi xác định lại rlà 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 wherenếu bạn chỉ cố gắng lọc ra các yếu tố distskhô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 wherevì 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.wheretrả 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 andgiữa hai danh sách các số, tất nhiên không có True/ Falsegiá trị mà bạn mong đợi. Nếu avà blà cả hai Truegiá trị, sau đó a and btrả 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.wheretrê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)?