#python #combinations
#python #комбинации
Вопрос:
Как сгенерировать все возможные комбинации матрицы 0-1 размером K на N?
Например, если я беру K = 2 и N = 2, я получаю следующие комбинации.
combination 1
[0, 0;
0, 0];
combination 2
[1, 0;
0, 0];
combination 3
[0, 1;
0, 0];
combination 4
[0, 0;
1, 0];
combination 5
[0, 0;
0, 1];
combination 6
[1, 1;
0, 0];
combination 7
[1, 0;
1, 0];
combination 8
[1, 0;
0, 1];
combination 9
[0, 1;
1, 0];
combination 10
[0, 1;
0, 1];
combination 11
[0, 0;
1, 1];
combination 12
[1, 1;
1, 0];
combination 13
[0, 1;
1, 1];
combination 14
[1, 0;
1, 1];
combination 15
[1, 1;
0, 1];
combination 16
[1, 1;
1, 1];
Комментарии:
1. Больше похоже на вопрос об алгоритме —> programmers.stackexchange.com
Ответ №1:
Однострочное решение с numpy
и itertools
:
[np.reshape(np.array(i), (K, N)) for i in itertools.product([0, 1], repeat = K*N)]
Объяснение: product
функция возвращает декартово произведение своих входных данных. Например, product([0, 1], [0, 1])
возвращает итератор, который содержит все возможные перестановки [0, 1]
и [0, 1]
. Другими словами, извлечение из итератора продукта:
for i, j in product([0, 1], [0, 1]):
фактически эквивалентно запуску двух вложенных циклов for:
for i in [0, 1]:
for j in [0, 1]:
Приведенные выше циклы for уже решают проблему для конкретного случая K, N = (1, 0)
. Продолжая изложенную выше мысль, чтобы сгенерировать все возможные нулевые / единичные состояния вектора i
, нам нужно извлечь выборки из итератора, который эквивалентен вложенному циклу for глубины l
, где l = len(i)
. К счастью, itertools
предоставляет платформу для выполнения именно этого с repeat
помощью аргумента ключевого слова. В случае проблемы OP эта глубина перестановки должна быть K*N
, чтобы ее можно было преобразовать в массив numpy правильных размеров на каждом этапе понимания списка.