首页 > 解决方案 > 为什么多条件掩码失败?

问题描述

假设我有一个 numpy 数组X、其中的一个元素x和一个名为dx. 我想创建一个掩码来观察y该元素周围的值,所以我这样做:

for x in X:
    window = (x-dx/2 <= X <= x+dx/2)   
    for y in Y[window]:
        ... 

为什么第二行失败?

如果我使用window = (x-dx/2 <= X) & (X <= x+dx/2)它,但它的可读性较差。window = np.logical_and(x-dx/2 <= X, X <= x+dx/2)在处理大型数组时也可以使用它来提高性能,而且可读性更差。

标签: python-3.xnumpy

解决方案


诸如这样的表达式x < y < z分两步进行评估:

  1. 首先(x < y).__bool__()是评估。如果返回True,则转到步骤 2,如果返回,False则为。如果它返回任何其他内容,则引发 a。也可能引发某种异常。x < y < zFalseTypeError(x < y).__bool__()
  2. 如果(x < y).__bool__()返回True,则y < z评估。在这种情况下, 的值x < y < z与 相同y < z。同样,可能会引发异常。

x如果或y具有多个元素numpy的数组,则问题出现在步骤 1 中。开发人员认为没有“好的”方法可以将具有多个元素的数组转换为单个值,因此他们决定不让您通过raise 一个.numpyboolndarray.__bool__()ValueError

注意:由于上述评估顺序,您可以在该位置放置一个numpy数组z,例如:

>>> 1 < 2 < np.arange(5)
array([False, False, False, True, True])

推荐阅读