Python 当尝试对数组进行索引时,包含多个元素的数组的真值是不确定的

Python 当尝试对数组进行索引时,包含多个元素的数组的真值是不确定的,python,numpy,list-comprehension,Python,Numpy,List Comprehension,如果var(另一个numpy数组)中的元素>=0并且您在尝试对涉及numpy数组的比较表达式使用Python布尔运算符(非,和,或)时,通常会收到此错误消息,例如 >>> x = np.arange(-5, 5) >>> (x > -2) and (x < 2) Traceback (most recent call last): File "<ipython-input-6-475a0a26e11c>", line 1, in &

如果var(另一个numpy数组)中的元素>=0并且您在尝试对涉及numpy数组的比较表达式使用Python布尔运算符(
)时,通常会收到此错误消息,例如

>>> x = np.arange(-5, 5)
>>> (x > -2) and (x < 2)
Traceback (most recent call last):
  File "<ipython-input-6-475a0a26e11c>", line 1, in <module>
    (x > -2) and (x < 2)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
但是,此类布尔数组不能用于索引普通Python列表,因此需要将其转换为数组:

rbs = np.array([ish[4] for ish in realbooks])

正如我在对先前答案的评论中告诉您的,您需要使用以下任一选项:

c[a & b]

原因是Python使用
关键字在两个布尔值之间进行测试。数组怎么可能是布尔值?如果其75%的项目为
True
,则是
True
还是
False
?因此,numpy拒绝将两者进行比较

因此,您要么使用逻辑函数逐个元素比较两个布尔数组(
np.logical_和
),要么使用二进制运算符
&

此外,为了编制索引,您确实需要一个与正在编制索引的数组大小相同的布尔数组。它必须是一个数组,不能使用
True/False
列表: 原因是使用布尔数组告诉NumPy返回哪个元素。如果使用
True/False
列表,NumPy会将其解释为
1/0
列表,即整数,即索引,这意味着您可以获得数组的第二个或第一个元素。不是你想要的

现在,正如您所猜测的,如果要使用两个布尔数组
a
b
进行索引,请选择
a
b
为真的项,您可以使用

c[np.logical_or(a,b)]

如果是直选者!=无:
ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()

哪一行导致错误?另外,请格式化您的代码,使其实际运行。如果您打印出var的值,这会有所帮助。猜测一下,问题在于您正在递减的字符串/浮点/文本替换变量。。。原始数据看起来像什么,需要进行一系列操作?
>>> np.logical_and(x > -2, x < 2)
array([False, False, False, False,  True,  True,  True, False, False, False], dtype=bool)
>>> x[np.logical_and(x > -2, x < 2)]
array([-1,  0,  1])
rbs = np.array([ish[4] for ish in realbooks])
c[a & b]
c[np.logical_and(a, b)] 
c[np.logical_or(a,b)]
c[a | b]
# draw the previous original bounding boxes
if rectsPersist != None:
    for (x, y, w, h) in rectsPersist:
        cv2.rectangle(orig, (x, y), (x + w, y + h), (0, 0, 255), 2)

# draw the previous final bounding boxes
if pickPersist != None:
    for (xA, yA, xB, yB) in pickPersist:
        cv2.rectangle(image, (xA, yA), (xB, yB), (0, 255, 0), 2)

if not count % 1:
    count = 0
    image = imutils.resize(image, width=min(700, image.shape[1]))