0

2D ビット マトリックスのすべての可能な組み合わせを生成する Python ジェネレーターを作成する必要があります。各次元の長さは可変です。

したがって、2x2 行列の場合:

1.
00
00

2.
10
00

3.
11
00

....

バツ。
00
01

より長い次元 (最大 200*1000) も機能する必要があります。最終的に、すべての組み合わせが必要になるわけではありません。各行の合計が 1 になるのは 1 回だけです。しかし、この場合はすべての組み合わせが必要です。降伏する前にそれらをフィルタリングします。印刷は不要です。

これをフィルタ マスクとして使用して、データ セットのすべての可能なバリエーションをテストしたいと考えています。このようなバリエーションの生成は、一般的な問題に違いありません。Python用の優れたライブラリさえあるのではないでしょうか?

ロバート

4

4 に答える 4

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 に答える
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

指定されたサイズのビット ベクトルのすべての可能な値を調べることは、まさにカウンターが行うことです。あなたの質問からは、どのような順序が必要かは明らかではありませんが、グレーのカウンターによく似ています。例:

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 に答える