#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])