空的numpy数组布尔矛盾。

3

我在使用Numpy时偶然发现了一些内容,但是我不太明白。如果我要检查一个空的Numpy数组是否存在任何真实值

    np.array([]).any()

如果我检查所有值都为true,则它将评估为true,否则它将评估为false

    np.array([]).all()

当它评估为true时,这对我来说看起来很奇怪,因为没有值是true,但同时所有值都是true...

3个回答

4
这不是一个 bug,它返回 "True" 是因为所有的值都不等于零,这是返回 "True" 的标准。请参见以下链接中的说明:note

NaN(非数值)、正无穷和负无穷被视为 "True",因为它们不等于零。

与以下内容进行比较:
In[102]:

np.array([True,]).all()
Out[102]: True

这将相当于一个充满NaN的数组,它会返回True

我原本并不认为这是一个错误,只是无法理解。但现在我明白了。所以,虽然 any() 函数在寻找 true 值,而 all() 函数则在寻找 false 值。感谢您的帮助... - Toggo
我认为可能是重复的问题:https://dev59.com/RmIk5IYBdhLWcg3wUsrv 解释了这种行为,所以我认为这是numpy遵循的惯例,我们可以将其标记为重复,但让我们看看其他人是否同意。 - EdChum

3
你所看到的逻辑不仅适用于NumPy。这是Python惯例,已经在NumPy中实现:
- any如果任何值为True则返回True,否则返回False。 - all如果没有值为False则返回True,否则返回False
请参见文档中的伪代码以查看纯Python中的逻辑。
对于np.array([]).any()any([]),没有True值,因为你有一个0维数组或0长度列表。因此结果为False
对于np.array([]).all()all([]),没有False值,因为你有一个0维数组或0长度列表。因此结果为True

1

这是一种正常的行为。

不可能找到一个真值,因此np.array([]).any()为False。

对于数组中的每个值,该值都为False(很容易检查,因为数组中没有任何值,所以您不需要检查任何内容)。


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