Python生成矩阵的所有可能组合

时间:2019-02-28 10:50:07

标签: python list math combinations

我需要在Python中生成矩阵的所有组合。输入将是两个整数n和m,我需要使用1和0作为可能的值来生成该矩阵的所有可能状态。

例如:

n = 3 m = 2
[[0 0 0] [1 0 0] [1 1 0]
 [0 0 0] [0 0 0] [0 0 0]
 [0 0 0],[0 0 0],[0 0 0] . . . . .
]

给定我直到运行时才知道n和m的值,是否有一种干净有效的方法来执行此操作?使用的最大值为n = 16 m = 16。

2 个答案:

答案 0 :(得分:5)

一种方法是在列表理解中生成所有长度为m*n的二进制序列,并在每次迭代时将它们重塑为(m,n)形嵌套列表。

一种生成所有序列的简单方法是采用01n*m重复的笛卡尔积,将产生2^(m*n)组合:

from itertools import product
m=3
n=3

x = [[list(i[x:x+m]) for x in range(0, len(i), m)] for i in product("01", repeat=m*n)]

输出

[[['0' '0' '0']
  ['0' '0' '0']
  ['0' '0' '0']]

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

 [['0' '0' '0']
  ['0' '0' '0']
  ['0' '1' '0']]
 ...

print(len(x))
# 512

答案 1 :(得分:4)

如果您想要一次使用所有矩阵,只需使用itertools.productnumpy.reshape生成平面列表:

from itertools import product
import numpy as np

n, m = 2, 2

x = product([1, 0], repeat=n*m)
x = np.reshape(list(x), (-1, n, m))
print(x)

输出为2x2:

array([[[1, 1],
        [1, 1]],

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

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

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

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

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

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

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

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

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

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

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

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

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

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

       [[0, 0],
        [0, 0]]])

请注意,对于n, m = 16, 16,有2**(16*16)个组合,大约为10**77,太大了,无法容纳到内存中。在这种情况下,您可能必须单独处理每个矩阵:

def get_combinations(n, m):
    for flat in product([1, 0], repeat=n*m):
        yield np.reshape(flat, (n, m))

您可以这样使用:

from itertools import islice

for m in islice(get_combinations(3, 3), 3):  # only get the first three
    print(m)

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