使用~反转numpy布尔数组

97

我能否使用~A来反转一个numpy布尔数组,而不是使用相当笨拙的函数np.logical_and()np.invert()

事实上,~似乎可以正常工作,但我在任何numpy参考手册中都找不到它,更令人担忧的是,它肯定不能处理标量(例如,bool(~True)返回True!),所以我有点担心……


4
请参阅 https://dev59.com/U2Yr5IYBdhLWcg3wi6o_。 - NPE
这个回答解决了你的问题吗?python中波浪线一元运算符作为否定numpy布尔数组 - AMC
2个回答

76

28
请注意,这种方法在由0和1组成的数组中不起作用!它只能用于布尔类型的数组。如果您需要处理这种灵活性,请使用numpy.logical_not。 - tvt173
6
是的,boolean notlogic not始终不同。问题和答案都涉及到了boolean not。无论如何,谢谢您提醒。 - squid
1
请注意,这仅适用于数组的 dtype=bool 的情况。我刚好遇到了一个由 TrueFalse 对象组成且 dtype=object 的数组的边缘情况。这些被转换为 ~True => -2~False => -1。请参见问题评论中链接的重复目标。 - Joooeey

2

如果数组的 dtype 是布尔类型,并且您确定随着软件成熟,这种情况不会改变,那么您可以使用波浪号。然而,np.logical_not 有两个优点:

  • 它也适用于对象数组,如果 np.nan 或其他对象出现在您的数组中,它们很容易显示出来。
  • 对于具有一定逻辑背景的任何人来说,它的含义是清晰的。

还有 np.invert,但它不能用于对象数组,而且这个词是有歧义的。

~np.array([False, True], dtype=bool)
Out[7]: array([ True, False])

~np.array([False, True], dtype=object)
Out[9]: array([-1, -2], dtype=object)

np.invert([True, False])
Out[4]: array([False,  True])

np.invert((np.array([True, False], dtype=object)))
Out[5]: array([-2, -1], dtype=object)

np.logical_not(np.array([False, True], dtype=bool))
Out[8]: array([ True, False])

np.logical_not(np.array([False, True], dtype=object))
Out[10]: array([True, False], dtype=object)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接