縦横のラベルの数から図の再現ができないか?の確認ロジック2

■ロジックをコードに落とす。
前回の確認ロジックは下のように考えたので、いくつかポイントとなりそうなところを考えてみる。
1.1行の中の組み合わせの総組み合わせを出す。例えば、([0, 1, 1, 1, 1, 1, 1, 1, 0], [0, 1, 1, …], [0, 1, 1, …], …)。ここで1を黒、0を白とする。
2.組み合わせの各要素の数が列の総数より小さいことを確認する。大きければNG。
3.OKの場合、次の行の組み合わせの総組み合わせを出す。
4.2、3の繰り返し。

1つ目、1行の組み合わせ。組み合わせについては、itertoolsというパッケージを使えば表示できるよう。サンプルコードが下。

list = range(6)
for comb in itertools.combinations(list, 2):
    list2 = numpy.zeros(6)
    if len(list) > 0:
        for n in comb:
            list2[n] = 1
        print(list2)

range(6) で [0, 1, 2, 3, 4, 5] を宣言して、その中から2つの組み合わせを取りだす(0,1、3,4など)。この数字をリストのインデックスと見立てて、該当するインデックスを1とする。
結果が下のもの。

これで組み合わせは作ることができた。

次に2つ目、縦の数の加算。
numpyを使うと単純に”+”で足し合わせるとそれぞれの要素で加算された。リストの場合は”+”では結合になっている。

np = numpy.array([1, 2])
np2 = numpy.array([1, 3])
c = np + np2
print(c)

list = [1, 2]
list2 = [1, 3]
d = list + list2
print(d)

上のコードの結果は下のようになる。

3つ目、次の行の組み合わせの扱い。1行目で出た組み合わせの総数に対してそれぞれ複数の組み合わせを検討する必要がある。そのため、行が進むごとに樹形図のような感じで枝分かれしていくイメージになる。樹形図のコーディングで典型になるようなものはないかな。
いろいろ考えても複雑になるばかりですっきりとしない。この辺りもう少し検討する。