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

标签 python numpy boolean multidimensional-array

应该是一个简单的问题,但我无法在任何地方找到答案。 python 中的 ~ 运算符记录为按位反转运算符。美好的。不过,我注意到看似精神 split 的行为:

~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 值。因此,对于标量 boolean 值,~ 不被视为逻辑否定。并不是说在使用 int 类型的 boolean 值定义的 numpy 数组上的行为是相同的。

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

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

最佳答案

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

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

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

关于python波浪号一元运算符作为否定numpy bool数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13600988/

相关文章:

python - 简单的 boolean 不等式运算符错误

c++ - C++中的bool是什么?

python - 将 CSV 文件读取为执行加法和平均的文本文件

python - 如何在Pandas数据框中的其他列中填充基于新列的值

numpy - Anaconda 环境安装包 Numpy-Base

python - 加速 Python 中的模运算

python - 在 Django REST 中,有没有一种方法可以在 RetrieveAPIView 中设置键,而不是在 ListAPIView 中进行过滤?

python - 使用 Python 将带有附件的 XML 发送到 SOAP ws

python - python audiolab中的蜂鸣声

java - `java (0 % 2 != 0) == false`