我需要在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。
答案 0 :(得分:5)
一种方法是在列表理解中生成所有长度为m*n
的二进制序列,并在每次迭代时将它们重塑为(m,n)
形嵌套列表。
一种生成所有序列的简单方法是采用01
与n*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.product
和numpy.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]]