【问题标题】:Use a.any() or a.all()使用 a.any() 或 a.all()
【发布时间】:2016-04-01 01:55:59
【问题描述】:
x = np.arange(0,2,0.5)
valeur = 2*x

if valeur <= 0.6:
    print ("this works")
else:   
    print ("valeur is too high")

这是我得到的错误:

if valeur <= 0.6:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我已经阅读了几篇关于 a.any() 或 a.all() 的帖子,但仍然找不到真正清楚地解释如何解决问题的方法。我明白为什么 Python 不喜欢我写的东西,但我不知道如何解决它。

【问题讨论】:

  • valeur 是一个向量,其中一些元素小于 0.6,一些元素更大。 valeur &lt;= 0.6 是什么意思?
  • valeur 是一个向量,等于 [ 0. 1. 2. 3.] 我对每一个词都感兴趣。对于 0.6 以下的部分,则返回“this works”。对于 0.6 以上的部分,返回“valeur is too high”,这是一个愚蠢的版本,我不是根据条件打印这个或打印那个,而是根据条件将 Valeur 的每个元素输入方程 1 或方程 2
  • 将单个值与向量进行比较就像比较橙子和苹果,any()all() 是验证向量中的任何元素是否满足该条件的函数,或者所有元素满足条件

标签: python numpy


【解决方案1】:

如果您查看valeur &lt;= 0.6 的结果,您会发现导致这种歧义的原因:

>>> valeur <= 0.6
array([ True, False, False, False], dtype=bool)

所以结果是另一个数组,在这种情况下有 4 个布尔值。现在结果应该是什么?当一个值为真时,条件是否应该为真?只有当所有值都为真时,条件才应该为真?

这正是 numpy.anynumpy.all 所做的。前者要求至少一个真值,后者要求所有值都为真:

>>> np.any(valeur <= 0.6)
True
>>> np.all(valeur <= 0.6)
False

【讨论】:

    【解决方案2】:

    还有另一种方法可以得到它

    import numpy as np
    
    a = np.array([1,2,3,4])
    b = np.array([5,6,7,8])
    c = np.array([1,2,3,4])
    
    print((a == b ).all())  #False
    print((a == c ).all())   # True
    print((a == b ).any())   #False
    print((a == c ).any())   #True
    print((a > 3 ).all())    #False
    

    【讨论】:

      【解决方案3】:

      你评论:

      valeur 是一个向量,等于 [ 0. 1. 2. 3.] 我对每一个词都感兴趣。对于0.6以下的部分,则返回“this works”......

      如果您对每个术语感兴趣,请编写代码以便处理每个术语。例如。

      for b in valeur<=0.6:
          if b:
              print ("this works")
          else:   
              print ("valeur is too high")
      

      这将写 2 行。

      numpy 代码在您尝试将它用于需要单个标量值的上下文时会产生错误。 if b:... 只能做一件事。它本身并不会遍历 b 的元素,为每个元素做不同的事情。

      您也可以将该迭代转换为列表理解,例如

      ['yes' if b else 'no' for b in np.array([True, False, True])]
      

      【讨论】:

        【解决方案4】:

        这也应该有效,并且是对问题中所问问题的更接近的答案:

        for i in range(len(x)):
            if valeur.item(i) <= 0.6:
                print ("this works")
            else:   
                print ("valeur is too high")
        

        【讨论】:

          【解决方案5】:

          如果你想为每个元素做一些事情:

          使用numpy的函数

          import numpy as np
          def temp(x):
              if x <= 0.6:
                  print ("this works")
              else:   
                  print ("valeur is too high")
          arr = np.arange(0,1,0.1)
          np.vectorize(temp)(arr)
          

          【讨论】:

            猜你喜欢
            • 2017-07-21
            • 2016-12-14
            • 1970-01-01
            • 2018-07-28
            • 2021-08-31
            • 2016-12-01
            • 1970-01-01
            • 2019-01-24
            • 2021-08-06
            相关资源
            最近更新 更多