【问题标题】:ValueError: How to iterate through a tuple of Boolean True/False statements?ValueError:如何遍历布尔 True/False 语句的元组?
【发布时间】:2023-03-16 10:54:02
【问题描述】:

我有一个 numpy ndarray tup1 语句 TrueFalse

print(tup1)

array([[ True, False, False, False],
       [ True, False, False, False],
       [False, False, False, False],
       [ True,  True, False, False]], dtype=bool)

我想通过以下方式遍历这个元组tup1

for i in tup1:
    if i == True:
        pass
    else:
        do something

将对所有“假”条目进行一些操作。但是,这不起作用:我收到以下错误:

---------------------------------------------------------------------------
ValueError 
Traceback (most recent call last)
<ipython-input-57-0d2a4ade1205> in <module>()
      1 for i in tup1:
----> 2     if i == True:
      3         pass
      4     else:

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

【问题讨论】:

  • 对不起大家。我将元组定义为tup1,而不是cond
  • 这是一个 NumPy 数组,不是元组。
  • 模棱两可的。当 any 条目为 False 或 all 条目为 False 时,您是否希望发生一些事情?
  • @MarkTolonen 对于 numpy 数组中的每个条目,如果 that 条目为 False,则执行一些操作。否则,通过。
  • @ShanZhengYang,您是说每个单独的布尔值都是 False 还是每个子数组中的所有布尔值都是 False?添加您预期的输出,因为它仍然不清楚

标签: python numpy boolean iteration tuples


【解决方案1】:

你有一个二维数组,所以只需创建一个嵌套的 for 循环,首先遍历每一行,然后遍历值:

for row in tup1:
    for item in row:
        if item: #equivalent to `if item == True`
            pass
        else:
            dosomething()

或简化为:

for row in tup1:
    for item in row:
        if not item: #equivalent to `if item == False`
            dosomething()

【讨论】:

  • 这与澄清评论所描述的最接近,但为什么不使用if not item: dosomething()
  • 你会认为这是有道理的,不是吗。已编辑:P
【解决方案2】:

您不能将列表与布尔值进行比较。您可以使用np.array.all() 属性来检查所有项目是否为真,any() 使用您的数组中是否有任何真,因此您可以使用not any 来检查所有项目是否为假:

>>> import numpy as np
>>> 
>>> tup1 = np.array([[ True, False, False, False],
...        [ True, False, False, False],
...        [False, False, False, False],
...        [ True,  True, False, False]], dtype=bool)
>>> for i in tup1:
...     if not i.any():
...        print i
... 
[False False False False]

【讨论】:

    【解决方案3】:

    你只需要在每个子数组上调用.all,如果所有的值都是假的,if not ele.all() 将评估为 True,如果有任何 True 值,那么它将评估为 False。

    import  numpy as np
    
    arr = np.array([[ True, False, False, False],
           [ True, False, False, False],
           [False, False, False, False],
           [ True,  True, False, False]], dtype=bool)
    
    for ele in arr:
        if not ele.all(): 
          # all values are False
    

    如果您想要每个单独的布尔值,您可以在数组上调用 .flat

    for ele in arr.flat:
        if not ele:
          .....
    

    在某些时间使用更大的数组,使用 .flat 比使用两个 for 循环要快得多:

    In [5]: %%timeit
    for row in arr:
        for item in row:
          pass
       ...: 
    100 loops, best of 3: 4.13 ms per loop
    
    In [6]: %%timeit
    for ele in arr.flat:
        pass
       ...: 
    1000 loops, best of 3: 231 µs per loop
    

    【讨论】:

      猜你喜欢
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多