python tilde unary operator as negation numpy bool array

Dr.*_*rew 35 python boolean numpy multidimensional-array

应该是一个简单的问题,但我无法在任何地方找到答案.~python中的运算符被记录为按位反转运算符.精细.我注意到看似精神分裂的行为,即:

~True -> -2
~1 -> -2
~False -> -1
~0 -> -1
~numpy.array([True,False],dtype=int) -> array([-2,-1])
~numpy.array([True,False],dtype=bool) -> array([False,True])
Run Code Online (Sandbox Code Playgroud)

在前4个示例中,我可以看到python正在实现(如文档所述)~x = -(x+1),输入被视为int,即使它是布尔值.因此,对于标量布尔值,~不被视为逻辑否定.并非在使用int类型的布尔值定义的numpy数组上的行为相同.

~那么为什么在布尔数组上作为逻辑否定运算符工作(另请注意:~numpy.isfinite(numpy.inf) -> True?)?

我必须not()在标量上使用它是非常烦人的,但是not()无法否定数组.然后对于一个数组,我必须使用~,但~不会否定一个标量......

eca*_*mur 33

not是通过__nonzero__特殊方法实现的,该方法需要返回True或者False,因此无法提供所需的结果.而是使用~运算符,这是通过__not__特殊方法实现的.出于同样的原因,&|用来代替andor.

PEP 335旨在允许重载布尔运算符但由于过多的开销而被拒绝(这会使if语句复杂化). PEP 225建议"元素"运算符的一般语法,它将提供更通用的解决方案,但已被推迟.看来目前的情况虽然尴尬,但并不足以迫使改变.

np.isfinite当在标量上调用时返回一个类型的值np.bool_,而不是bool. np.bool_也是从bool dtype数组中提取标量值时获得的类型.如果你使用np.True_np.False_到位的TrueFalse你会得到下一致的行为~.