Как определить массив со всеми возможными комбинациями чисел - PullRequest
0 голосов
/ 04 мая 2020

Я хочу определить массив с заданным количеством столбцов (скажем, n = 5), и в каждой ячейке массива значение может быть 0 или 1. И я хотел бы создать все возможности единиц и нули, что означает, что каждая строка будет представлять один возможный вектор с n элементами.

Другими словами, я хочу, чтобы таблица выглядела так:

enter image description here

Я знаю, что создать вектор единиц и нулей довольно легко, но как я могу убедиться, что векторы не повторятся в таблице и что будут включены все возможные комбинации (Если моя математика верна, таблица должна иметь 2 ** 5 = 32 строки)

Как я могу сделать это в Python? Большое спасибо

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Вы можете сгенерировать все числа до 32 и преобразовать каждое в двоичное представление, используя сдвиги битов.

combs = [[(n >> p) & 1 for p in range(4, -1, -1)] for n in range(32)]

, что дает combs как:

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

В качестве альтернативы, Вы можете использовать функцию рекурсивной генерации:

def gimme_combs(n):
    if n == 1: return [[0], [1]]
    lower_combs = gimme_combs(n - 1)
    return [[0] + c for c in lower_combs] + \
           [[1] + c for c in lower_combs]

, которая даст тот же результат при вызове с:

combs = gimme_combs(5)
1 голос
/ 04 мая 2020

Легко с itertools:

itertools.product(*[[0, 1]] * 3)

приводит к

[(0, 0, 0),
 (0, 0, 1),
 (0, 1, 0),
 (0, 1, 1),
 (1, 0, 0),
 (1, 0, 1),
 (1, 1, 0),
 (1, 1, 1)]
...