Последовательный перебор последовательных масок

Есть двумерный массив из целых чисел.У каждой строки есть цифровая метка/характеристика. Например, (кусок) введите сюда описание изображения

№ строки        метка   1   2   3   4   5 
1   0,00093459          0   0   0   0   0 
2   0,001706309        -1   -1  1   0   0 
3   -0,000440785        1   0   1   1   0 
4   0,00490243         1    1   1   0   0 
5   -0,008171593      -1    0   -1  -1  1 
6   0,0011686         -1    -1  1   0   -1 
7   0,00719967         1    0   1   1   0 
8   -0,004407099        -1  0   -1  -1  1 
9   0,001286239         -1  -1  -1  0   0 
10  -0,000536647       -1   -1  -1  0   0 
11  -0,000307875       -1   -1  1   0   -1 
12  -0,003430157       -1   -1  -1  0   1 
13  0,001801731         1   0   1   1   -1
14  0,003960876       -1    0   -1  -1  1

(прошу прощения, не нашел как вставить таблицу)

Надо реализовать перебор массива с целью поиска комбинаций значений столбцов при которых строки, удовлетворяющие значению столбцов удовлетворяли бы значению условия к меткам. Например, надо найти такие столбцы и такое их значение, при которых количество положительных меток (первый столбец) было больше чем отрицательных. Ответ: Столбец 3 должен быть = 1, Столбец 4 должен быть = 0. ТОгда у нас в фильтре останется 4 строки (2, 4, 6 и 12), из них 3шт - с положительными метками и только одна с отрицательными.

Первой идеей было сделать вложенные циклы, но при количестве строк более 20000 уже четвертый вложенный цикл выполнялся часами. Видится решением использование векторных вычислений с помощью NUMBA, но я пока не понимаю как решить задачу в векторах. Может сделать отдельный массив индексов, в котором каждый столбец и его каждое значение указывают номер строки в которой они встречаются и потом искать пересечение индексов? Тогда возникает задача последовательно перебора бинарной маски. Т.е. если у нас, например, Х столбцов, при этом значения в них варьируются от -1 до 1, то количество массивов с индексами = Х * 3. И надо организовать перебор маски двоичной по этим столбцам: 2 ** (Х*3). Т.е. формируется двоичная маска и по ней фильтруются столбцы с индексами. Как сделать двоичную маску, желательно, векторизованно? Т.к. для Х = 50 это уже дикие по времени циклы. А Х может быть и 100.. и 200...

Может я не в том направлении иду, и есть какой-то иной алгоритм?


Ответы (0 шт):