【问题标题】:Enumerating all possible combination of values for binary variables枚举二进制变量的所有可能的值组合
【发布时间】:2021-07-31 10:06:28
【问题描述】:

假设我有 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。

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

【问题讨论】:

    标签: python arrays binary iteration enumeration


    【解决方案1】:

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

    【讨论】:

    • itertools 是否保证始终这样格式化输出?
    • @flakes "嵌套循环像里程表一样循环,每次迭代时最右边的元素都会前进。这种模式创建了一个字典顺序,因此如果输入的可迭代对象被排序,则产品元组按排序顺序发出。” - docs.
    • 这太棒了!谢谢!
    【解决方案2】:

    这是一个纯粹的 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]]
    

    【讨论】:

    • 这也是一个很好的解决方案。感谢分享!
    【解决方案3】:

    嗯,这只是从 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多