在numpy数组中将1更改为0,将0更改为1而不循环

时间:2019-06-14 08:46:05

标签: python python-3.x numpy

让我们说我有一个numpy数组,我想将所有的1交换为0,将所有的0交换为1(该数组将具有其他值,而0和1并没有什么特别的)。当然,我可以循环遍历该数组,并按1对其进行更改。是否有推荐的有效方法? np.where()方法是否有此操作的选项?

5 个答案:

答案 0 :(得分:9)

这是使用np.where并以给定值按XOR0取按位1的一种方式:

np.where((a==0)|(a==1), a^1, a)

例如:

a = np.array([[0,1,2,1], [1,2,0,3]])
print(a)
array([[0, 1, 2, 1],
       [1, 2, 0, 3]])

np.where((a==0)|(a==1), a^1, a)

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

答案 1 :(得分:2)

对于np.where来说,这是一个不太聪明的选项,仅用于索引:

where_0 = np.where(arr == 0)
where_1 = np.where(arr == 1)

arr[where_0] = 1
arr[where_1] = 0

如果您对其他值了解更多(例如,它们都是很小的数字),则可能会有更多选择,但这是最简单的。

答案 2 :(得分:2)

一种非常简单的方法,不需要使用任何特殊方法,例如np.where(),就是获取numpy数组中变量条件的索引,并相应地分配所需的值(在您的情况下,0的{​​{1}}和1s的{​​{1}})到数组中的各个位置项。这也适用于10s以外的其他值。另外,您不需要任何临时变量即可交换值。

0s

答案 3 :(得分:2)

a^(a&1==a)

例如

a = np.arange(-3, 4)
a^(a&1==a)
# array([-3, -2, -1,  1,  0,  2,  3])

答案 4 :(得分:0)

iverted = ~arr + 2 应该做的工作