Как получить относительное дополнение логического массива numpy и другого? - PullRequest
2 голосов
/ 25 марта 2020

Допустим, у меня есть два numpy массива:

>>> v1
array([ True, False, False, False,  True])
>>> v2
array([False, False,  True,  True,  True])

Я пытаюсь получить массив, который имеет одинаковую длину (5) и содержит True в каждой позиции, где v1==True AND v2==False , Это будет:

array([True, False,  False,  False,  False])

Есть ли быстрый способ в numpy, что-то вроде logical_not(), но с учетом v1 в качестве ссылки и v2 в качестве запроса?

Ответы [ 3 ]

2 голосов
/ 25 марта 2020

Для логических значений логические и побитовые операции одинаковы. Следовательно, писать

v1 & ~v2

довольно идиоматично c. Однако это побитовая операция, которая создает потенциально ненужный временный массив. Вы не можете написать v1 and not v2 столько, сколько хотите, потому что python ожидает преобразования входных данных в одиночные логические значения. Вместо этого вам нужно вызвать logical_and и logical_not ufuncs:

np.logical_and(v1, np.logical_not(v2))

Приятно то, что вы можете избежать временного массива, или даже написать непосредственно в буфер по вашему выбору:

result = np.empty_like(v1)
np.logical_not(v2, out=result)
np.logical_and(v1, result, out=result)

Вы можете даже сделать все это на месте (в v2):

np.logical_and(v1, np.logical_not(v2, out=v2), out=v2)
2 голосов
/ 25 марта 2020

Вам просто нужно использовать право bitwise operators:

v1 & ~v2
# array([ True, False, False, False, False])
1 голос
/ 25 марта 2020

Вы можете использовать побитовые операторы здесь:

>>> v1 & ~v2
array([ True, False, False, False, False])
...