【发布时间】:2019-09-18 05:10:27
【问题描述】:
TLDR: is-comparison 适用于 Python bool,不适用于 numpy bool_。是否存在其他差异?
几天前我遇到了一个奇怪的布尔值行为。当我尝试对这个 numpy 数组使用 is-comparison 时:
arr1 = np.array([1,0,2,0], dtype=bool)
arr1
Out[...]: array([ True, False, True, False])
(这些变量名是虚构的,与真实变量名或生产代码的任何相似之处纯属巧合)
我看到了这个结果:
arr1 is True
Out[...]: False
这是合乎逻辑的,因为arr1 不是 True 或 False,它是 numpy 数组。我检查了这个:
arr1 == True
Out[...]: array([ True, False, True, False])
这按预期工作。我提到了这个可爱的行为并立即忘记了它。第二天我检查了数组元素的真实性:
[elem is False for elem in arr1]
它还给我这个!
Out[...]: [False, False, False, False]
我真的很困惑,因为我记得在 Python 数组中(我认为问题出在数组行为中):
arr2 = [True, False, True, False]
[elem is False for elem in arr2]
有效:
Out[...]: [False, True, False, True]
此外,它还在我的另一个 numpy 数组中工作:
very_cunning_arr = np.array([1, False, 2, False, []])
[elem is False for elem in very_cunning_arr]
Out[...]: [False, True, False, True, False]
当我深入我的数组时,我发现very_cunning_arr 是由numpy.object 构造的,因为它包含两个非数字元素,所以它包含Python 布尔值,而arr1 是由numpy.bool_ 构造的。所以我检查了他们的行为:
numpy_waka = np.bool_(True)
numpy_waka
Out[...]: True
python_waka = True
python_waka
Out[...]: True
[numpy_waka is True, python_waka is True]
我终于发现了不同之处:
Out[...]: [False, True]
在所有这些之后,我有两个问题:
-
numpy.bool_和bool在它们的共同行为上是否还有其他差异? (我知道numpy.bool_有很多numpy函数和参数,比如.T等等) - 如何检查 numpy 数组是否仅包含 numpy 布尔值,而不包含 Pythonic 布尔值?
(PS:是的,现在我知道用is比较真/假是不好的):
不要使用 == 将布尔值与 True 或 False 进行比较。
Yes: if greeting: No: if greeting == True: Worse: if greeting is True:
编辑1:正如another question 中提到的,numpy 有自己的bool_ 类型。但是这个问题的细节有点不同:我发现 is-statements 的工作方式不同,但在这种差异之前 - bool_ 和 bool 行为是否有其他共同点?如果是,具体是什么?
【问题讨论】:
-
感谢“任何与真实变量名相似...”的笑话。你得到了我。