0

我不确定这是合并还是两个单独的导入,或者我应该完全重新考虑。我最初是在玩 gephi 之后开始使用 igraph,在那里我总是会进行两阶段导入,首先是边缘,然后是节点数据。这是 igraph 的明智策略吗?

所以,感谢最近的一些帮助,我刚刚导入了一个看起来像这样的边缘列表:

123123 321321 1
222222 333333 2
123123 333333 3
222222 321321 4

...使用导入命令

import igraph
g = igraph.Graph.Read_Ncol('edgelist.txt')

我想向这个 edgelist 导入为我生成的节点添加属性。这些将类似于...

123123 "color:red" "community:1"
222222 "color:blue" "community:2"
321321 "color:red" "community:1"
333333 "color:red" "community:2"

如何将此数据附加到当前图表?我看到许多用于导入复杂边缘列表的格式,但没有用于节点列表的格式。我错过了什么?是否没有自动将节点数据附加到适当节点的功能?

如果没有,有人可以推荐一种更简单的方法来将节点数据适当地填充到现有图表中吗?

我的直觉是……

[g.vs["color"] = x for x in node_list.color if g.vs["name"] == node_list.name]
[g.vs["community"] = x for x in node_list.community if g.vs["name"] == node_list.name]

但这看起来非常笨拙。

4

1 回答 1

2

好吧,你走在正确的轨道上,是的,它会有点笨拙。它很笨拙,因为 igraph 在其核心深处是一个普通的 C 库,并且在 C 中使用数字(即顶点和边 ID)而不是名称(即顶点和边名称)要容易得多。这就是为什么 igraph 使用从零开始的整数来指代顶点和边而不是它们的名称,这就是为什么你必须跳过一个额外的环才能从它的名称到达顶点本身。

我可能会做以下事情:

  1. 使用 读取边缘列表Graph.Read_Ncol。(你已经这样做了)。
  2. 构建一个将顶点名称映射回其 ID 的字典:

    >>> id_mapping = dict((v, k) for k, v in g.vs["name"])
    
  3. 将您的属性文件读入node_list. 我假设这node_list.name给了我一个顶点名称列表,并node_list.color给了我一个包含相应颜色的列表。然后,您可以执行以下操作:

    >>> for name, color in izip(node_list.name, node_list.color):
    ...     g.vs[id_mapping[name]]["color"] = color
    

第三步中的另一种方法是使用g.vs.find(name),它为您提供一个Vertex对象,该对象引用具有给定名称的顶点。然后,您可以将属性分配给该顶点;例如:

>>> for name, color in izip(node_list.name, node_list.color):
...     g.vs.find(name)["color"] = color

在这种情况下,您不需要id_mapping. 实际上,igraph 在后台name为顶点属性维护了一个名称到 ID 的映射,并利用了这个映射。如果您想使用不同的顶点属性作为顶点的唯一键而不是 ,则基于 - 的方法更有用。g.vs.findid_mappingname

于 2013-01-24T20:56:38.850 回答