Python 枚举二进制变量的所有可能值组合
假设我有n个变量,每个变量有两个值:0或1。如果我想列举所有可能的值的组合,那将是2^n个可能的组合。我想知道如何以一种干净简单的方式生成这个 想象n=4。我们希望生成一个numpy数组或类似的东西,如下面手动生成的示例Python 枚举二进制变量的所有可能值组合,python,arrays,binary,iteration,enumeration,Python,Arrays,Binary,Iteration,Enumeration,假设我有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 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(输入())
对于范围(0,功率(2,n))内的i:
cur=“”
对于范围(0,n)内的j:
如果我&(1这里有一个纯粹的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进行演练
编号将变为:
[[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]]
[4 2 1]
指数将变为:
[[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]]
[4 2 1]
(指数和数字)
将数字
中每行的按位and应用于所有指数
:
[[0 0 0]
[0 0 1]
[0 2 0]
[0 2 1]
[4 0 0]
[4 0 1]
[4 2 0]
[4 2 1]]
((指数和数字)>0)。aType(int)
将其减少为0和1:
[[0 0 0]
[0 0 1]
[0 1 0]
[0 1 1]
[1 0 0]
[1 0 1]
[1 1 0]
[1 1 1]]
itertools
是否保证输出的格式始终如此?@flakes“嵌套循环就像里程表一样循环,最右边的元素在每次迭代中前进。此模式创建字典顺序,因此如果输入的iterables被排序,则产品元组将按排序顺序发出。”-。这太棒了!谢谢!这也是一个简洁的解决方案。谢谢分享!