python波浪号一元运算符作为否定numpy bool数组

Posted

技术标签:

【中文标题】python波浪号一元运算符作为否定numpy bool数组【英文标题】:python tilde unary operator as negation numpy bool array 【发布时间】:2012-11-16 01:30:47 【问题描述】:

应该是一个简单的问题,但我无法在任何地方找到答案。 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 即使它是布尔值。因此,对于标量布尔值,~ 不被视为逻辑否定。并不是说在使用 int 类型的布尔值定义的 numpy 数组上的行为是相同的。

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

感谢ecatmur 的解释,特别是提到&|。我不知道这些,而是​​使用了logical_and和logical_or。 我使用numpy 已经很久了,直到现在还不知道像np.False_ 这样看似重新定义但带有下划线的结构的用途。现在这一切都说得通了

以上是关于python波浪号一元运算符作为否定numpy bool数组的主要内容,如果未能解决你的问题,请参考以下文章

Scala ~>(波浪号大于)运算符

python数据分析 python numpy--函数和数组运算

C 语言 运算符表

正则表达式中的波浪号运算符

〜位运算符(波浪号)的功能是啥[重复]

C中的波浪号运算符