2

次のようなタプルのリストがあります。

[(x,{'y':'1,3','z':'2'}),
(y,{'a':'4'}),
(z,{'b':'2,3'})]

次のように、これを numpy 配列形式に変換する必要があります。

    x   y   z   a   b
x   0   1,3 2   0   0
y   1,3 0   0   4   0
z   2   0   0   0   2,3
a   0   4   0   0   0
b   0   0   2,3 0   0

これをサポートするには、ノード名をリストとして保存して、マッピング インデックスを指定します。

[x,y,z,a,b]

インデックスを考えると、この構造からnumpy配列を作成する最も効率的な方法は何ですか?
また、新しいエントリがタプルの元のリストに入ると、必要に応じてインデックス リストと numpy 配列に追加されます。

既存の要素の編集は行われません。

助けていただければ幸いです。

4

2 に答える 2

1

objectdtypes を使用する場合は、以下のアプローチで配列を構築できます。2D 対称性が必要なため、最初に 2D 配列を作成し、そこから構造化配列を作成する方が簡単です。

import numpy as np
o = ['x','y','z','a','b']
a = np.zeros((len(o),len(o)),dtype=object)
s  =[('x',{'y':'1,3','z':'2'}), ('y',{'a':'4'}), ('z',{'b':'2,3'})]
for vi in s:
    i = o.index(vi[0])
    for vj in vi[1].items():
        j = o.index(vj[0])
        a[i,j] = vj[1]
        a[j,i] = a[i,j]

# building the structured array
b = np.zeros((len(o),), dtype=[(i,object) for i in o])
for i,vi in enumerate(o):
    b[vi] = a[i,:]

# building a dictionary to access the values
d = dict(( (vi, dict(( (vj, a[i,j]) for j,vj in enumerate(o) ))) for i,vi in enumerate(o) ))
于 2013-07-01T11:08:11.477 に答える
0

よりnumpythonicバージョン...値は文字列として保存されます。これは変更できますが、おそらく、辞書の入力リストの構文をより適切に定義する必要があります。

import numpy as np
import operator as op

data = [('x', {'y' : '1,3', 'z' : '2'}),
        ('y', {'a' : '4'}),
        ('z', {'b' : '2,3'})]

keys = np.array(['x', 'y', 'z', 'a', 'b'])
keys_sort = np.argsort(keys)

rows = [(item[0], item[1].keys(), item[1].values()) for item in data]


rows = np.array(reduce(op.add, ([item[0]]*len(item[1]) for item in data)))
cols = np.array(reduce(op.add, (item[1].keys() for item in data)))
vals = np.array(reduce(op.add, (item[1].values() for item in data)))

row_idx = keys_sort[np.searchsorted(keys, rows, sorter=keys_sort)]
col_idx = keys_sort[np.searchsorted(keys, cols, sorter=keys_sort)]

out_arr = np.empty((len(keys), len(keys)), dtype=vals.dtype)
out_arr[:] = '0'
out_arr[row_idx, col_idx] = vals
out_arr[col_idx, row_idx] = vals

>>> out_arr
array([['0', '1,3', '2', '0', '0'],
       ['1,3', '0', '0', '4', '0'],
       ['2', '0', '0', '0', '2,3'],
       ['0', '4', '0', '0', '0'],
       ['0', '0', '2,3', '0', '0']], 
      dtype='|S3')
于 2013-07-01T15:41:30.160 に答える