为了账号安全,请及时绑定邮箱和手机立即绑定

脾气暴躁的地方有多个条件

脾气暴躁的地方有多个条件

慕勒3428872 2019-10-16 13:48:16
我有一组距离称为dists。我想选择两个值之间的距离。我编写了以下代码行: dists[(np.where(dists >= r)) and (np.where(dists <= r + dr))]但是,这仅针对条件选择 (np.where(dists <= r + dr))如果我通过使用临时变量按顺序执行命令,则效果很好。为什么上面的代码不起作用,如何使它起作用?干杯
查看完整描述

3 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

在您的特定情况下,最好的方法是将两个条件更改为一个条件:


dists[abs(dists - r - dr/2.) <= dr/2.]

它仅创建一个布尔数组,在我看来是更易于阅读,因为它说,是dist一个内dr或r?(尽管我将重新定义r为您感兴趣的区域的中心,而不是开始的位置,所以r = r + dr/2.)但这并不能回答您的问题。


问题的答案:如果您只是想过滤出不符合标准的元素,则

实际上并不需要:wheredists


dists[(dists >= r) & (dists <= r+dr)]

因为&将会为您提供基本元素and(括号是必需的)。


或者,如果您where出于某些原因要使用,可以执行以下操作:


 dists[(np.where((dists >= r) & (dists <= r + dr)))]

原因:

不起作用的原因是因为np.where返回的是索引列表,而不是布尔数组。您试图and在两个数字列表之间移动,这些数字当然没有您期望的True/ False值。如果a和b都是两个True值,则a and b返回b。所以说些话[0,1,2] and [2,3,4]只会给你[2,3,4]。它在起作用:


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]),)

您期望比较的只是布尔数组,例如


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)

现在您可以调用np.where组合的布尔数组:


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. ])

或者使用花式索引简单地用布尔数组对原始数组进行索引


In [241]: dists[(dists >= r) & (dists <= r + dr)]

Out[241]: array([ 5. ,  5.5,  6. ])


查看完整回答
反对 回复 2019-10-16
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

由于接受的答案很好地说明了问题。您还可以使用numpy逻辑函数,该函数更适合多种情况:


np.where(np.logical_and(np.greater_equal(dists,r),np.greater_equal(dists,r + dr)))


查看完整回答
反对 回复 2019-10-16
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

我喜欢np.vectorize用于此类任务。考虑以下:


>>> # 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.argwhere代替以np.where获得清晰的输出。但这是您的电话:)


希望能帮助到你。


查看完整回答
反对 回复 2019-10-16
  • 3 回答
  • 0 关注
  • 348 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信