具有每种可能组合的2D位矩阵

时间:2014-11-06 10:42:20

标签: python variations

我需要创建一个python生成器,它可以产生2D位矩阵的每种可能组合。 每个维度的长度是可变的。

所以对于2x2矩阵:

1。
00
00

2。
10个
00

3。
11个
00

...

X。
00
01

更高的尺寸长度(高达200 * 1000)也需要工作。 最后,我不需要所有的组合。我只需要每行中总和为1的一次。但我需要所有组合,在这种情况下。我会在屈服之前过滤它们。不需要打印。

我想将其用作过滤器掩码来测试数据集的所有可能变体。 生成这样的变体必定是一个常见问题。也许有一个很好的python库?

罗伯特

4 个答案:

答案 0 :(得分:0)

您可以使用0到4之间的每个数字(2到2的幂)生成长度为2的所有可能性。

0 -> 00 
1 -> 01 
2 -> 10 
3 -> 11

对于以二进制显示数字的部分,可以使用bin函数。

由于您有2x2矩阵,因此需要2个数字(ij),每个数字用于一行。然后你可以将这些数字转换成二进制并打印出来。

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])