Использование входной суммы логических массивов как включающего «или»

#python #numpy

#python #numpy

Вопрос:

Я хотел бы сравнить множество m-by-n логических массивов numpy и получить массив той же формы, записи которого являются True , если соответствующая запись хотя бы в одном из входов есть True .

Самый простой способ, который я нашел для этого, это:

 In [5]: import numpy as np                                                      

In [6]: a = np.array([True, False, True])                                       

In [7]: b = np.array([True, True, False])                                       

In [8]: a   b                                                                   
Out[8]: array([ True,  True,  True])
  

Но я также могу использовать

 In [11]: np.stack([a, b]).sum(axis=0) > 0                                       
Out[11]: array([ True,  True,  True])
  

Являются ли эти операции эквивалентными? Есть ли какие-либо ошибки, о которых я должен знать? Является ли один метод предпочтительнее другого?

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

1. Во втором примере вы создаете новый массив numpy, вызывая stack . Вы создаете временный массив, содержащий все элементы вашего массива, для того, что является тривиальной операцией. Я бы остался, a b если вы не планируете выполнять несколько операций над np.stack([a, b])

2. Это, конечно, кажется np.any() более подходящим и читаемым здесь. np.any([a, b], axis=0)

Ответ №1:

Вы можете использовать np.logical_or

 a = np.array([True, False, True])
b = np.array([True, True, False])
np.logical_or(a,b)
  

это также работает для (m,n) массивов

 a = np.random.rand(3,4) < 0.5
b = np.random.rand(3,4) < 0.5
print('an',a)
print('bn',b)
np.logical_or(a,b)
  

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

1. Для логических массивов вы также можете просто использовать | . (Логические массивы реализуют это как логическое или.)