ValueError: How to iterate through a tuple of Boolean True/False statements?

ValueError: How to iterate through a tuple of Boolean True/False statements?

我有一个 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

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

---------------------------------------------------------------------------
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()

你有一个二维数组,所以只需创建一个嵌套的 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()

您不能将列表与布尔值进行比较。您可以使用 np.array.all() 属性来检查所有项目是否为 True,如果数组中有任何 True 则使用 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]

你只需要在每个子数组上调用 .all,如果所有的值都是 False 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