枚举二进制变量值的所有可能组合
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]]
假设我有 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]]