python tilde一元运算符作为否定numpy bool数组

python tilde一元运算符作为否定numpy bool数组,python,numpy,boolean,multidimensional-array,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])

这应该是一个简单的问题,但我在任何地方都找不到答案。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数组上行为是相同的

为什么
~
然后作为布尔数组上的逻辑求反运算符工作(另请注意:
~numpy.isfinite(numpy.inf)->True
?)


我必须在标量上使用
not()
,但
not()
无法对数组求反,这是非常恼人的。然后对于一个数组,我必须使用
~
,但是
~
对标量求反不起作用。

是通过
非零
特殊方法实现的,它需要返回
,因此它不能给出所需的结果。相反,使用了
~
运算符,该运算符通过
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。出于同样的原因,
&
|
被用来代替

旨在允许布尔运算符重载,但由于开销过大而被拒绝(例如,如果
语句
,则会使
语句复杂化)。建议使用“elementwise”运算符的通用语法,这将提供更通用的解决方案,但已被推迟。目前的形势虽然尴尬,但似乎还不足以迫使改变


当对标量调用时,
np.isfinite
返回类型为
np.bool\uu
的值,而不是
bool
np.bool\uu
也是从bool数据类型数组中提取标量值时得到的类型。如果您使用
np.True
np.False
代替
True
False
,您将在
~
下获得一致的行为

感谢ecatmur的解释,特别是提到
&
。我不知道这些,而是使用了逻辑和和逻辑。我使用
numpy
很久了,直到现在还不知道那些看似重新定义但带下划线的结构的用途,比如
np.False
。这一切现在都有意义了