Измените 1 на 0 и 0 на 1 в массиве numpy без циклов - PullRequest
2 голосов
/ 14 июня 2019

Допустим, у меня есть массивный массив, где я хотел бы поменять местами все 1 с 0 и все 0 на 1 (массив будет иметь другие значения, и нет ничего особенного в 0 и 1). Конечно, я могу перебрать массив и изменить его 1 на 1. Есть ли эффективный метод, который вы можете порекомендовать использовать? у метода np.where () есть опция для этой операции?

Ответы [ 4 ]

9 голосов
/ 14 июня 2019

Вот один из способов использования np.where и взятия поразрядного XOR заданного значения, когда оно равно 0 или 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]])
2 голосов
/ 14 июня 2019
a^(a&1==a)

например

a = np.arange(-3, 4)
a^(a&1==a)
# array([-3, -2, -1,  1,  0,  2,  3])
2 голосов
/ 14 июня 2019

Очень простой способ, который не требует использования какого-либо специального метода, такого как np.where(), состоит в том, чтобы получить индексы для условий переменных в вашем массиве numpy и соответственно назначить требуемое значение (в вашем случае 0 для 1s и 1 для 0s) для соответствующих позиционных элементов в массиве. Это работает и для значений, отличных от 0s и 1s. Кроме того, вам не требуется никакая временная переменная для замены значений.

import numpy as np
arr = np.array([1, 0, 2, 3, 6, 1, 0])
indices_one = arr == 1
indices_zero = arr == 0
arr[indices_one] = 0 # replacing 1s with 0s
arr[indices_zero] = 1 # replacing 0s with 1s

Output: array([0, 1, 2, 3, 6, 0, 1])
2 голосов
/ 14 июня 2019

Это менее умный вариант с np.where, просто использующий его для индексации:

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

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

Если вы знаете больше о других значениях (например, все они небольшие числа), может быть большеварианты, но это самое простое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...