0

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

所以对于一个 2x2 矩阵:

1.
00
00

2.
10
00

3.
11
00

……

X。
00
01

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

我想用它作为过滤器掩码来测试数据集的所有可能变化。产生这样的变化一定是一个常见的问题。也许甚至有一个很好的python库?

罗伯特

4

4 回答 4

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

请注意,向量的尺寸与计数器无关,只有大小。此外,虽然这给出了每个静态模式,但它并没有涵盖所有可能的转换。

于 2014-11-06T10:55:04.220 回答
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

PS:这对 2X2 矩阵有好处,但对于高阶来说会有点耗时和内存消耗。如果有人为此提供更便宜的算法,我会很高兴。

于 2014-11-06T11:04:39.567 回答
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
于 2014-11-06T10:48:46.630 回答
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])
于 2016-11-11T16:37:07.700 回答