Эффективная логика И каждой комбинации двух элементов маски - PullRequest
0 голосов
/ 26 марта 2020

Я хочу взять массив numpy, который представляет собой одномерную логическую маску размера N, и преобразовать ее в новую маску, где каждый элемент представляет собой логическое И над двумя элементами маски (я не хочу повторять одинаковые комбинации дважды, поскольку порядок не имеет значения для логического «И»).

Пример ввода:

mask = [1, 0, 1] = [a, b, c]

Ожидаемый результат:

newmask = [1*0, 1*1, 0*1] = [0, 1, 0] = [a*b, a*c, b*c]

1 Ответ

0 голосов
/ 03 апреля 2020

Из списка элементов вы можете создавать все возможные их комбинации, где их порядок не имеет значения, не тратя время на повторные комбинации:

from itertools import combinations_with_replacement
import numpy as np

n = 3
elements_to_combine = [0, 1]
for c in combinations_with_replacement(elements_to_combine, n):
    x = np.array(list(c))
    print(x)

и вывод:

[0, 0, 0]
[0, 0, 1]
[0, 1, 1]
[1, 1, 1]

Теперь у вас есть метод прямого шага для вычисления только тех комбинаций, которые вам нужны. Вы также можете добавить элементы в список "elements_to_combine", а также можете увеличить размер n в соответствии с вашими потребностями. Поскольку вы точно не указали тип используемых элементов и то, как вы собираетесь маскировать свои элементы с помощью логических операций И, я оставлю все остальное вам. Надеюсь, что это решит ваши проблемы с производительностью.

Ура!

...