Выполнить логическую операцию OR над несколькими массивами NumPy

#python #pandas #numpy

#python #pandas #numpy

Вопрос:

У меня есть следующий код:

 array1 = np.array([1,0,1,0])
array2 = np.array([1,1,0,0])

array3 = array1 | array2
  

array3 будет:

 [1 1 1 0]
  

Этот код работает нормально, но я хотел бы расширить его на большее количество массивов без записи array1 | array2 | array3 | etc .

Кто-нибудь знает эффективный способ сделать это? Возможно, с использованием .any()?

Комментарии:

1. Я не знаю, как это делается в Python, но концепция известна как «сворачивать», «уменьшать» или «накапливать». Ищите похожие функции в python std.

2. Ха-ха-ха, поиск в Google намного проще, когда вы знаете термин! Большое спасибо

Ответ №1:

Здесь я бы придерживался NumPy, но есть несколько способов сделать это. Вот использование logical_or.reduce .

 np.logical_or.reduce([array1, array2])
# array([ True,  True,  True, False])
  

Другим вариантом является использование с помощью column_stack и any :

 np.column_stack([array1, array2]).any(axis=1)
# array([ True,  True,  True, False])
  

Комментарии:

1. Я думаю о том, np.any([array1,array2],axis=0) может ли это сработать здесь?

2. @Wen-Ben Ага. Но any все равно нужно преобразовать список [array1,array2] в новый массив. Это примерно то же самое, что и column_stack, может быть, немного быстрее… возможно, мы могли бы узнать больше о таймингах 🙂

Ответ №2:

Вы могли бы использовать reduce с operator.or_ :

 import operator
from functools import reduce

reduce(operator.or_, [array1, array2])
# array([1, 1, 1, 0])
  

Обратите внимание, что в Python 3 он reduce был перенесен в functools библиотеку, но в Python 2 он встроенный.

Комментарии:

1. Я выбрал другой ответ, поскольку работаю в numpy. Ваше решение тоже выглядит неплохо, и я буду иметь это в виду в следующий раз, когда не буду использовать np!

Ответ №3:

Поскольку вы отмечаете pandas один из способов использования any для | , если вам нужно amp; , попробуйте с all

 pd.DataFrame([array1,array2]).any(1).values
  

Комментарии:

1. Ого. На самом деле я спрашивал, чтобы включить это в то, что я делаю в pandas, так что это здорово. Спасибо!

2. @HenryDashwood ха, удачного кодирования 🙂

Ответ №4:

Вы также можете суммировать два массива. Если любой из элементов равен 1, сумма будет равна 1. Если оба равны 1, сумма будет равна 2, и в этом случае вы переназначаете значение 1, используя np.where как

 array3 = np.where(array1 array2==2, 1, array1 array2)
# array([1, 1, 1, 0])