【问题标题】:How exactly does the .any() Python method work? [duplicate].any() Python 方法究竟是如何工作的? [复制]
【发布时间】:2020-10-17 19:39:21
【问题描述】:

我正在尝试编写一个脚本来模拟一段时间内的化学反应系统。该函数的输入之一是以下数组:

popul_num = np.array([200, 100, 0, 0])

其中包含系统中每个物种的离散分子的数量。主要函数的一部分有一个if 语句,用于检查分子数量是否为正。 if 处理到下一次迭代,else 跳出整个模拟

if popul_num.any() < 0: # Any method isn't working! --> Does .any() work on arrays or just lists? 
        print("Break out of loop negative molecule numbers")
        tao_all = tao_all[0:-1]
        popul_num_all = popul_num_all[0:-1]       
    else:
        break

我使用.any() 来尝试查找popul_num 数组的任何元素是否为负数。但它不起作用,它没有抛出错误,系统只是从不进入 if 语句,我不知道为什么?

我刚刚运行了这个程序,系统返回的最终分子数是:[135 -19 65 54] 程序应该在第二个元素达到 -19 之前就爆发了。

有什么建议吗?

干杯

【问题讨论】:

  • any 将在至少有一个元素为 True 时返回 True; any(iterable)
  • 只需执行if np.any(popul_num &lt; 0): # do_stuffif (popul_num &lt; 0).any(): #do_stuff。您首先在应用any 之前构造一个布尔数组之前

标签: python arrays numpy if-statement any


【解决方案1】:

您应该在进行比较之后 对布尔数组使用.any(),而不是popul_num 本身的值。如果布尔数组的任何值为True,它将返回True,否则返回False

事实上,.any() 测试任何“truthy”值,对于整数来说这意味着非零值,所以它会在一个整数数组上测试它们是否非零,即你在做什么,但这不是测试你有兴趣知道的事情。然后代码通过对any 返回的布尔值执行&lt; 0 测试来复杂化问题,该测试始终评估True,因为布尔值被视为01(对于False 和@987654334 @ 分别)在涉及整数的操作中。

你可以这样做:

if (popul_num < 0).any():
    do_whatever

这里的popul_num &lt; 0 是一个布尔数组,包含逐元素比较的结果。在您的示例中:

>>> popul_num < 0
array([False, False, False, False], dtype=bool)

但是,使用array.any()(或np.any(array))而不是使用内置的any() 是正确的。后者恰好适用于一维数组,但不适用于更多维度。这是因为迭代例如在一个 4d 数组上(这是内置的 any() 会做的)给出一个 3d 数组序列,而不是单个元素。

同样还有.all()。上面的测试相当于:

if not (popul_num >= 0).all():

【讨论】:

    【解决方案2】:

    numpy数组的any方法返回一个布尔值,所以当你写:

    if popul_num.any() < 0:
    

    popul_num.any() 将是 True (=1) 或 False (=0),因此它永远不会小于零。因此,您永远不会输入此 if 语句。

    any() 所做的是将数组中的每个元素评估为布尔值,并返回其中 任何 个元素是否为真。例如:

    >>> np.array([0.0]).any()
    False
    
    >>> np.array([1.0]).any()
    True
    
    >>> np.array([0.0, 0.35]).any()
    True
    

    如您所见,Python/numpy 认为 0 是虚假的,而所有其他数字都是真实的。因此,在一个数字数组上调用any 可以告诉我们数组中的任何数字是否非零。但是你想知道是否有任何数字是,所以我们必须先转换数组。让我们在你的数组中引入一个负数来演示。

    >>> popul_num = np.array([200, 100, 0, -1])
    >>> popul_num < 0  # Test is applied to all elements in the array
    np.ndarray([False, False, False, True])
    >>> (popul_num < 0).any()
    True
    

    您在列表与数组方面询问了any。 Python 内置的list 没有any 方法:

    >>> [].any()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'list' object has no attribute 'any'
    

    有一个名为any 的内置函数(不是方法,因为它不属于一个类),其用途与numpy .any 方法相同。这两个表达式在逻辑上是等价的:

    any(popul_num < 0)
    
    (popul_num < 0).any()
    

    我们通常认为第二个会更快,因为 numpy 是用 C 实现的。但是只有第一个可以处理非 numpy 类型,例如 listset

    【讨论】:

      【解决方案3】:

      any() 是一种用于可迭代对象的方法。如果可迭代项中的任何项目是真实的,则它返回True。你想要更多类似的东西:

      if any([True for x in popul_num if x > 0]):
        print("at least one element was greater than zero!")
      

      【讨论】:

        【解决方案4】:

        any() 返回 True,如果至少有一个元素是 True

        L1 = [False, False, False]
        any(L1)
        # >>> False
        
        L1 = [True, False, False]
        any(L1)
        # >>> True
        
        L1 = ["Hi", False, False]
        any(L1)
        # >>> True
        
        L1 = []
        any(L1)
        # >>> False
        
        

        【讨论】:

          【解决方案5】:

          any() 如果 NumPy 数组中的至少一个元素的计算结果为 True,则返回 True,并且 np.all 测试沿给定轴的所有数组元素是否计算为 True。你需要解决问题的是 all 方法。

          【讨论】:

            猜你喜欢
            • 2013-05-06
            • 1970-01-01
            • 2012-01-26
            • 2019-10-12
            • 1970-01-01
            • 1970-01-01
            • 2023-03-16
            • 2012-10-07
            • 1970-01-01
            相关资源
            最近更新 更多