我需要创建一个python生成器,它可以产生2D位矩阵的每种可能组合。 每个维度的长度是可变的。
所以对于2x2矩阵:
1。
00
00
2。
10个
00
3。
11个
00
...
X。
00
01
更高的尺寸长度(高达200 * 1000)也需要工作。 最后,我不需要所有的组合。我只需要每行中总和为1的一次。但我需要所有组合,在这种情况下。我会在屈服之前过滤它们。不需要打印。
我想将其用作过滤器掩码来测试数据集的所有可能变体。 生成这样的变体必定是一个常见问题。也许有一个很好的python库?
罗伯特
答案 0 :(得分:0)
您可以使用0到4之间的每个数字(2到2的幂)生成长度为2的所有可能性。
0 -> 00
1 -> 01
2 -> 10
3 -> 11
对于以二进制显示数字的部分,可以使用bin
函数。
由于您有2x2矩阵,因此需要2个数字(i
和j
),每个数字用于一行。然后你可以将这些数字转换成二进制并打印出来。
for i in range(4):
for j in range(4):
row1 = bin(i)[2:].zfill(2)
row2 = bin(j)[2:].zfill(2)
print row1, "\n" , row2, "\n"
修改强>
我找到zfill
函数,用zeros
填充字符串以使其固定长度。
>>> '1'.zfill(5)
'00001'
另一种通用解决方案可能是:
import re
dim1 = 2
dim2 = 2
n = dim1 * dim2
i = 0
limit = 2**n
while i < limit:
print '\n'.join(re.findall('.'*dim2, bin(i)[2:].zfill(n))), '\n'
i += 1
答案 1 :(得分:0)
遍历给定大小的位向量的所有可能值正是计数器的作用。从你的问题中你不清楚你想要什么样的顺序,但它看起来很像一个格雷计数器。例如:
from sys import stdout
w,h=2,2
for val in range(2**(w+h)):
gray=val^(val>>1)
for y in range(h):
for x in range(w):
stdout.write('1' if gray & (1<<(w*y+x)) else '0')
stdout.write('\n')
stdout.write('\n')
请注意,矢量的尺寸与计数器无关,只与尺寸有关。此外,虽然这给出了每个静态模式,但它并未涵盖所有可能的过渡。
答案 2 :(得分:0)
这可以通过以下方式使用itertools的排列来完成。
import itertools
dim=2
dimension = dim*dim
data = [0 for i in range(0,dimension)] + [1 for i in range(0,dimension)]
count = 1
for matrix in set(itertools.permutations(data,dimension)):
print('\n',count,'.')
for i in range(0,dimension,dim):
print(' '.join(map(str,matrix[i:i+dim])))
count+=1
P.S:这对于2X2矩阵来说是好的,但是为了更高阶,需要花费一点时间和内存消耗。如果有人为此提供较便宜的算法,我会很高兴。
答案 3 :(得分:0)
你可以为3x3二进制矩阵做这样的事情:
for i in range(pow(2,9)):
p = '{0:09b}'.format(i)
print(p)
x = []
x.append([p[0],p[1],p[2]])
x.append([p[3],p[4],p[5]])
x.append([p[6],p[7],p[8]])
for i in range(3):
x[i] = map(int, x[i])