TLDR:is比较适用于Pythonbool,而不适用于numpybool_。是否存在其他差异?在
几天前我遇到了一个奇怪的布尔人行为。当我尝试对这个numpy数组使用is comparison时:arr1 = np.array([1,0,2,0], dtype=bool)
arr1
Out[...]: array([ True, False, True, False])
(这些变量名基于虚构,与真实变量名或生产代码的任何相似之处都纯属巧合)
我看到了这个结果:
^{pr2}$
这是合乎逻辑的,因为arr1不是真或假,而是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 bool,arr1是由numpy.bool_构造的。所以我检查了他们的行为:numpy_waka = np.bool_(True)
numpy_waka
Out[...]: Truepython_waka = True
python_waka
Out[...]: True
[numpy_waka is True, python_waka is True]
我终于发现了区别:
Out[...]: [False, True]
在所有这些之后,我有两个问题:numpy.bool_和{}在它们的共同行为中是否还有其他的不同?(我知道numpy.bool_有许多numpy函数和参数,比如.T和其他)
如果没有核的话,怎么能检查出没有灵魂的小精灵?在
(注:是的,现在我知道用is来比较真/假是不好的):Don't compare boolean values to True or False using ==.Yes: if greeting:
No: if greeting == True:
Worse: if greeting is True:
编辑1:如another question所述,numpy有自己的bool_类型。但是这个问题的细节有点不同:我发现is语句的工作方式不同,但是在这个区别之前-bool_和{}的共同行为有什么不同吗?如果是,具体是什么?在