我有一个元组列表如下:
[(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 数组中。
现有元素的编辑不会发生。
感谢您的帮助。
请您参考如下方法:
如果您使用object dtypes,您可以按照下面的方法构建您的数组。由于您需要 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) ))
