On может создать все возможные комбинации с n
элементами из данного массива, например:
from itertools import combinations
[*combinations(range(4), 2)]
# [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
Я пытаюсь найти способ адаптировать это, чтобы найти m
этих комбинацийс "максимальным разнообразием".То, что я подразумеваю под этим, вероятно, лучше всего объяснить на примере:
diverse_combinations(range(4), n=2, m=3)
# either of these would be what I'm looking for
# [(0, 1), (2, 3), (0, 2)] # or
# [(0, 1), (2, 3), (1, 2)] # or
# [(0, 2), (1, 3), (0, 1)] # ...
Поэтому я хочу, чтобы отдельные элементы в комбинациях моего подмножества были как можно ближе равномерно распределены (или как можно ближе).Поэтому это не совсем то, что я хочу:
def diverse_combinations(arr, n, m):
for idx, comb in enumerate(combinations(arr, n)):
if idx == m:
break
yield comb
[*diverse_combinations(np.arange(4), n=2, m=3)]
# [(0, 1), (0, 2), (0, 3)]
Наконец, я рассматриваю вопрос, чувствительный к производительности, так как он сводится к чему-то вроде:
diverse_combinations(range(100), n=50, m=100)
# a list with 100 tuples of len=50 where each element appears
# ~equally often
Ярад за любые подсказки!