Как сгенерировать все возможные комбинации матрицы 0-1 в Python?

#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 правильных размеров на каждом этапе понимания списка.