枚举二进制变量值的所有可能组合

Enumerating all possible combination of values for binary variables

假设我有 n 个变量,每个变量都有两个值:0 或 1。如果我想枚举所有可能的值组合,那将是 2^n 种可能的组合。我想知道如何以干净简单的方式生成它?

假设 n=4。我们想要生成一个 numpy 数组或类似以下手动生成示例的东西。

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

请注意顺序很重要。第一列总是查看 col1 = 0 的情况,然后继续查看 col1 = 1 的情况。然后 col2 查看 col2 = 0 的情况,给定 col1 = 0,然后 col2 = 1,给定 col1 = 0,然后 col2 = 0 假定 col1 = 1,最后 col2 = 1 假定 col1 = 1。依此类推。基本上我需要这种排序方法来保持 n.

这可以通过迭代方法解决吗?

itertools.product([0, 1], repeat=4) 将给出一个产生这样一个序列的迭代器。 np.array(list(itertools.product([0, 1], repeat=4))) 会给你一个 numpy 数组。

好吧,这只是迭代从 0 到 2^n 的数字,然后以二进制表示法打印,所以我想这将以简单的迭代方式工作:

n = int(input())

for i in range(0, pow(2, n)):
    cur = ""
    for j in range(0, n):
        if i & (1 << j): # If the bit is on add '1' to the string
            cur = cur + '1'
        else:
            cur = cur + '0' # If the bit is off add '0' to the string
    print(cur[::-1]) # Reverse the resulting string

这是一个纯粹的 numpy 解决方案:

import numpy as np


def bin_array(n):
    numbers = np.arange(2 ** n).reshape(2 ** n, 1)
    exponents = (2 ** np.arange(n))[::-1]
    return ((exponents & numbers) > 0).astype(int)


print(bin_array(4))

演练 n = 3

numbers 将变为:

[[0]
 [1]
 [2]
 [3]
 [4]
 [5]
 [6]
 [7]]

exponents 将变为:

[4 2 1]

(exponents & numbers)numbers 中每一行的按位与应用于所有 exponents:

[[0 0 0]
 [0 0 1]
 [0 2 0]
 [0 2 1]
 [4 0 0]
 [4 0 1]
 [4 2 0]
 [4 2 1]]

((exponents & numbers) > 0).astype(int) 将其减少为零和一个:

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