50

应该是一个简单的问题,但我无法在任何地方找到答案。~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])

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

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

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

4

1 回答 1

46

not是通过__nonzero__特殊方法实现的,需要返回Trueor False,所以不能给出需要的结果。而是使用~运算符,它是通过__not__特殊方法实现的。出于同样的原因,&and|被用来代替andand or

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

np.isfinite在标量上调用时返回类型的值np.bool_,而不是boolnp.bool_也是从 bool dtype 数组中提取标量值时获得的类型。如果您使用np.True_andnp.False_代替TrueandFalse您将在~.

于 2012-11-28T09:59:32.340 回答