>>> # function which returns True when constraints are satisfied.
>>> func = lambda d: d >= r and d<= (r+dr)
>>>
>>> # Apply constraints element-wise to the dists array.
>>> result = np.vectorize(func)(dists)
>>>
>>> result = np.where(result) # Get output.
我喜欢用
np.vectorize
来完成这些任务。请考虑以下几点:您也可以使用
np.argwhere
而不是np.where
进行清除输出。但这是你的要求:)希望有帮助。
在您的特定情况下,最好的方法是将您的两个条件更改为一个条件:
它只创建一个布尔数组,在我看来更容易阅读,因为它说,是
dr
或r
中的dist
?(尽管我将r
重新定义为您感兴趣区域的中心而不是开始,所以r = r + dr/2.
)但这并不能回答您的问题。问题的答案:
如果您只是试图筛选出不符合您的条件的
where
元素,那么实际上不需要where
:因为
&
将为您提供一个元素级的and
(括号是必需的)。或者,如果出于某种原因确实要使用
where
,可以执行以下操作:原因:
它不起作用的原因是
np.where
返回的是索引列表,而不是布尔数组。您正在尝试在两个数字列表之间获取and
,这当然没有您期望的True
/False
值。如果a
和b
都是True
值,则a and b
返回b
。所以说[0,1,2] and [2,3,4]
这样的话只会给你[2,3,4]
。这就是它的作用:您希望比较的只是布尔数组,例如
现在可以对组合布尔数组调用
np.where
:或者使用fancy indexing将原始数组与布尔数组进行索引
因为公认的答案很好地解释了这个问题。您还可以使用numpy logical functions,它在这里更适合于多种情况:
相关问题 更多 >
编程相关推荐