在一维NumPy数组中翻转0和1

30

我有一个由0和1组成的一维NumPy数组,就像这样:

array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])

我想要一种快速的方法来“翻转”数值,使零变成一,一变成零,从而得到像这样的NumPy数组:

array([1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

有没有一个简单的一行代码实现这个功能?我看了一下fliplr()函数,但似乎需要二维或更高维的NumPy数组。我相信有一个相当简单的答案,但任何帮助都将不胜感激。


注意:Python有布尔类型,NumPy也有。请使用它们,而不是0/1或'0'/'1'。 - AMC
5个回答

103

在你的问题中一定有我不理解的地方...

不管怎么样

In [2]: from numpy import array

In [3]: a = array((1,0,0,1,1,0,0))

In [4]: b = 1-a

In [5]: print a ; print b
[1 0 0 1 1 0 0]
[0 1 1 0 0 1 1]

In [6]: 

4
确实简单易懂,赞一个。唯一的潜在问题是它不容易原地修改。正是因为这个原因,我更喜欢使用按位异或a = a ^ 1,它可以让你做 a ^= 1 - Jaime
1
为什么选择这个而不是 numpy.logical_not()~?特别是因为 OP 明显在使用布尔值。 - AMC

14

你应该使用布尔数据类型的迹象

a = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=np.bool)
# or
b = ~a
b = np.logical_not(a)

7

另一个多余的选项:

numpy.logical_not(a).astype(int)

2
answer = numpy.ones_like(a) - a

1
(实际上@gboffi的答案更好) - heltonbiker

1
我也找到了一种方法:
In [1]: from numpy import array

In [2]: a = array([1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

In [3]: b = (~a.astype(bool)).astype(int)


In [4]: print(a); print(b)
[1 1 1 1 1 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 1 1 1 1 1 1 1 1 1 1]

不过,我认为 @gboffi 的回答是最好的。我本来想给他点赞的,但是我还没有足够的声望 :(


欢迎来到 Stack Overflow!如果一个问题已经得到了回答 - 特别是如果它是三年前的问题(!) - 请不要添加一个你知道比被选中的解决方案更差的解决方案。祝你好运! - GalAbra

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