Проверьте, существует ли комбинация bools в массиве? - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть многомерный массив строк, который выглядит следующим образом. Первый столбец - это идентификатор, в столбце 2-4 - три разные переменные:

              #ID    Var1    Var2   Var3
comparison = [['1' 'False' 'False' 'True']
              ['2' 'False' 'True' 'False']
              ['3' 'False' 'True' 'False']
              ...
              ['98' 'False' 'True' 'False']
              ['99' 'False' 'True' 'False']
              ['100' 'False' 'True' 'False']]

У меня есть циклы, которые выводят, где все три переменные истинны, это прекрасно работает:

true_vars = np.array([])

for idx in comparison:
    if ((idx[1] == 'True') and (idx[2] == 'True') and (idx[3] == 'True')):
        true_vars = np.append(true_vars, idx)

Однако я хочу написать еще один l oop, который проверяет, нет ли в общем массиве из 100 строк идентификаторов, в которых все три переменные имеют значение true. Нечто похожее на следующее, хотя следующее не работает:

true_vars = np.array([])

for idx in comparison:
    if ((idx[1] == 'True') and (idx[2] == 'True') and (idx[3] == 'True')):
        true_vars = np.append(true_vars, idx)
    elif not exist ((idx[1] == 'True') and (idx[2] == 'True') and (idx[3] == 'True')):
        print('there are no true ID's in comparison') 

Таким образом, идеальным было бы то, что он проходит через все 100 строк в моем массиве сравнения, не находит ни одной строки, где все 3 значения являются истинными, и поэтому распечатывает, что в сравнении нет идентификаторов, где все 3 переменные истинны.

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

попробуйте этот код.

import numpy as np

comparison = [['1', 'False', 'True', 'True'],
          ['2', 'False', 'True', 'False'],
          ['3', 'True', 'True', 'True'],
          ['100', 'False', 'True', 'False']]

true_vars = np.array([])

for idx in comparison:
  if ((idx[1] == 'True') and (idx[2] == 'True') and (idx[3] == 'True')):
    true_vars = np.append(true_vars, idx)
  if idx[0] == '100' and len(true_vars) == 0:
    print('there are no true ID\'s in comparison') 
    break
1 голос
/ 08 апреля 2020

Эту задачу можно выполнить без l oop, используя метод np.ndarray.all :

import numpy as np

comparison = np.array([['1', 'False', 'False', 'True'],
                       ['2', 'False', 'True', 'False'],
                       ['3', 'False', 'True', 'False'],
                       ...
                       ['98', 'False', 'True', 'False'],
                       ['99', 'False', 'True', 'False'],
                       ['100', 'False', 'True' ,'False']])

# Since you values are string we compare them with 'True' to get booleans:
(comparison[:,1:] == 'True').all(axis=1)
array([False, False, False,..., False, False, False])

Теперь, если вы хотите проверить, верно ли что-либо из этого Вы можете использовать np.any :

np.any((comparison[:,1:] == 'True').all(axis=1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...