numpy 为什么python all([[False,True],[False,False]])被认为是True

agyaoht7  于 2023-04-06  发布在  Python
关注(0)|答案(3)|浏览(188)

标题几乎说明了一切。如果我问Python什么是all(test = [[False, True],[False, False]]),它输出True:

all(test)
Out[279]: True

我在玩Python的布尔值,发现这个很难理解。
如果我把它变成一个Numpy数组test = np.array([[False, True],[False, False]]),它会输出False:

test.all()
Out[283]: False
cgh8pdjw

cgh8pdjw1#

Numpy以一种更注重数学的方式来实现,它实际上会查看所有列表中的所有值。另一方面,Python解释器从编程的Angular 来看待它。
all([[False, True],[False, False]])计算为True的原因是Python的两个怪癖。

  1. all(iterable)函数查看可迭代对象中的每个元素,并检查它们是否都是真的。
    1.不为空的列表是truthyall()函数检查超级列表中的每个元素,并查看其结构为[list, list]。但是,all()并没有进入每个子列表,而是简单地评估每个子列表是否为“truthy”。由于子列表中都有值,因此它们都是truthy,因此评估为True。最后,all()只看到超级列表由两个truthy元素组成,因此它返回True`。
14ifxucb

14ifxucb2#

很酷的问题。解决这个问题的最好方法是在Python REPL中自己尝试一下:

$ python
[Clang 14.0.0 (clang-1400.0.29.202)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> bool([False])
True
>>> bool(False)
False
>>> all([[]])
False
>>> all([[False]])
True

但是,嘿,我是谁,但一个卑微的乌鸦,站在巨人的肩膀上在这里。查看this answer这里了解更多的细节和澄清。

w8rqjzmb

w8rqjzmb3#

在Python中,非空列表是“真”的

>>> bool([False, True])
True

all不会比这更深入地研究对象。你给它两个非空列表,你得到了True作为回报。
ndarray.all做同样的事情,除了它更深入地查看数组。这就是numpy的重点-它将操作广播到它的元素。您可以调整它的参数,例如axis,它将考虑数组的子集。
你可以用vanilla python做类似的事情,通过迭代内部列表:

>>> test = [[False, True],[False, False]]
>>> all(val for inner in t2 for val in inner)
False

相关问题