Python:属性错误:'bool'对象没有属性'all'。

6

我正在根据一个和我一起学习的人的代码,为了解决我的问题进行改编。

以下是他的代码:

     if not((paux1 == paux2).all()):
        pop[int(saidaFO[pos,0]),:] = paux2
        pos -= 1

并且它可以正常工作,当我打印时,我会得到以下paux1的结果: [-2.3668 1.3174]。我有一个不同的问题需要解决,但是当我打印paux1时,我得到的是: [0.2107491848569726, 443, 3]。因此,当我尝试进行相同的比较时:
如果不是((paux1 == paux2).all()):
我得到了这个错误:"AttributeError: 'bool' object has no attribute 'all' "。我不明白发生了什么... 能有人帮帮我吗?我不太理解.all()是如何工作的... 或许编写等效的代码可能会起作用...

6
在原始代码中,paux1和paux2究竟是什么类型的对象? - snakecharmerb
2
你好,请仔细阅读 如何提问好问题?如何创建一个最小化、可重现的示例。根据提供的信息,我们无法重现它。"bool" 确实没有任何 "all" 方法。 - Alexander Santos
在原始代码中,“if”语句被放置在循环内部吗?当您有多个元素要尝试时,可以使用.any()和.all()。 - powerPixie
抱歉各位,我才刚开始学习Python不久...所以我无法提供你们所说的所有重要信息。但是Guimoute的答案解决了我的问题。 - SSS
3个回答

7
在你们的代码中,paux1paux2可能是numpy数组,所以paux1 == paux2返回一个表示布尔值(测试相等是否为真或假)的数组,并且该数组具有.all()方法。
听起来你正在使用列表,所以paux1 == paux2不像numpy数组一样逐个比较元素。你只检查两个列表是否相等,这将返回一个单个布尔值。该布尔值没有.all()方法,这就是导致错误的原因。
事先将你的值列表转换为numpy数组,就可以解决错误了。
paux1 = np.array(paux1)
paux2 = np.array(paux2) 

Guimoute,如何以正确的方式执行与“all()”相同的操作,而无需转换列表?因为这种解决方案可以在此处解决问题,但会在代码的另一部分引起兼容性问题。 - SSS
假设它们具有相同的长度,如果所有的(x1 == x2 for (x1, x2) in zip(paux1, paux2))都成立: - Guimoute
请注意,无论使用哪种方法,如果您检查浮点数之间的相等性,可能会遇到问题。例如,1 != 1.00000000001。 - Guimoute
谢谢!我已经进行了测试,'if (paux1==paux2)' 也可以工作! - SSS

7

错误的另一个来源是两个np.array形状不同。例如:

(np.array([[1,1]])==np.array([1,2,3])).all()

返回:

    ---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-400-ea9825114062> in <module>
----> 1 (np.array([[1,1]])==np.array([1,2,3])).all()

AttributeError: 'bool' object has no attribute 'all'

嗨,这是一个很好的观察,你是否知道如何比较两个NumPy数组以查看它们的形状是否不同? - skrhee
1
在numpy中,您可以执行assert arr1.shape == arr2.shape - zfj3ub94rf576hc4eegm

0

这是我解决它的方法。

import numpy as np
a = np.array([1,2,3])
b = np.array([1,2,3])
if a in b and b in a:
    print("ok")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接