4

次のディクショナリを、ディクショナリの最初と 2 番目の値が列と行の値であるマトリックスに変換したいと考えています。マトリックスが真の場合は「1」が必要で、偽の場合は「0」が必要です。

{0: [2, 5.0], 1: [6, 7.0], 2: [6, 8.0], 3: [5, 6.0], 4: [1, 5.0], 5: [3, 4.0], 6 : [4, 5.0]}

望ましい出力は次のようになります

        1   2   3   4   5   6   7   8

1       0   0   0   0   1   0   0   0
2       0   0   0   0   1   0   0   0
3       0   0   0   1   0   0   0   0
4       0   0   1   0   1   0   0   0
5       1   1   0   1   0   1   0   0
6       0   0   0   0   1   0   1   1
7       0   0   0   0   0   1   0   0
8       0   0   0   0   0   1   0   0

どうもありがとう、どんなポインタも素晴らしいでしょう!

ダニエル。

4

3 に答える 3

2

これはあなたの希望する出力に一致するものですが、@Antimonyの回答を基礎として使用すること(numpy)がおそらく進むべき道だと思います(少なくともこの回答よりもそうです)

N = 8

d = {0: [2, 5.0], 1: [6, 7.0], 2: [6, 8.0], 3: [5, 6.0], 4: [1, 5.0], 5: [3, 4.0], 6: [4, 5.0]}

m = [0] * (N ** 2 + 1)

for x, y in d.values():
    m[x + int(y - 1) * N] = 1
    m[int(y) + (x - 1) * N] = 1

print " ".ljust(9),
print "   ".join(map(str, range(1, N + 1)))
print
for i in range(1, N ** 2 + 1):
    if i % N == 1:
        print "%d  ".ljust(10) % (i / N + 1),
    val = m[i]
    print "%d  " % val,
    if not i % N:
        print

出力

          1   2   3   4   5   6   7   8

1         0   0   0   0   1   0   0   0  
2         0   0   0   0   1   0   0   0  
3         0   0   0   1   0   0   0   0  
4         0   0   1   0   1   0   0   0  
5         1   1   0   1   0   1   0   0  
6         0   0   0   0   1   0   1   1  
7         0   0   0   0   0   1   0   0  
8         0   0   0   0   0   1   0   0 

@Antimonyの回答に対する@DSMのコメントに基づいて、numpyを使用したものを次に示します。

import numpy
N = 8
m = numpy.zeros((N,N))

d = {0: [2, 5.0], 1: [6, 7.0], 2: [6, 8.0], 3: [5, 6.0], 4: [1, 5.0], 5: [3, 4.0], 6: [4, 5.0]}

for i,j in d.itervalues(): 
    m[i-1,j-1] = 1
    m[j-1,i-1] = 1

print " ".ljust(9),
print "   ".join(map(str, range(1, N + 1)))
print
for i, line in enumerate(m.tolist()):
    print "%s %s" % (("%s".ljust(10) % (i+1),"   ".join(map(str, map(int, line)))))

出力

          1   2   3   4   5   6   7   8

1         0   0   0   0   1   0   0   0
2         0   0   0   0   1   0   0   0
3         0   0   0   1   0   0   0   0
4         0   0   1   0   1   0   0   0
5         1   1   0   1   0   1   0   0
6         0   0   0   0   1   0   1   1
7         0   0   0   0   0   1   0   0
8         0   0   0   0   0   1   0   0
于 2012-08-18T04:25:59.257 に答える
0

辞書のキーとして数字を使用しても意味がありません。リストを使用する必要があります。

vals = [True, True, False, True] # Assuming this is a list of n*n elements
matrix = [] # This will be a two-dimensional array, or matrix.

これにより、任意のサイズのリストの正方行列が生成されます。

from math import sqrt
size = sqrt(len(vals))
for x in range(0, size):
    matrix.append(list(vals[x*size:x*size+size]))

# matrix == [[True, True], [False, True]]
# matrix[0][0] == True
# int(matrix[0][0]) == 1
于 2012-08-18T04:34:52.387 に答える
0

あなたの与えられた望ましい出力は意味がありませんが、あなたが実際に望んでいることを私が推測するものがあります。次のようにして、0番目の行と列を切り取ることができますm = m[1:,1:]

>>> d = {0: [2, 5.0], 1: [6, 7.0], 2: [6, 8.0], 3: [5, 6.0], 4: [1, 5.0], 5: [3, 4.0], 6: [4, 5.0]}
>>> dims = [1 + int(x) for x in map(max, zip(*d.values()))]
>>> m = numpy.zeros(dims, dtype=int)
>>> for v in map(tuple, d.values()):
    m[v] = 1

>>> m
array([[0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 1, 1]])
于 2012-08-18T04:19:18.567 に答える