python tilde unary operator as negation numpy bool array

时间:2012-11-28 08:41:30

标签: python numpy boolean 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])

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

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

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

1 个答案:

答案 0 :(得分:28)

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

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

在标量上调用时,

np.isfinite会返回np.bool_类型的值,而不是boolnp.bool_也是从bool dtype数组中提取标量值时获得的类型。如果您使用np.True_np.False_代替TrueFalse,您将在~下获得一致的行为。