当前位置: 首页 > 知识库问答 >
问题:

用python中的igraph创建无向加权图

居琛
2023-03-14

我有一个文本文件中的数据,我想创建一个无向加权图,因为我从文件中读取它。数据由tweet组成。对于tweet中的每个单词,我在图中创建一个节点。对于其他单词,我在它们之间创建一条边,并为它们的权重增加1。因此边缘的权重应该是所有tweet中出现的两个单词的数量。

我创建一个图表:

graph=igraph.Graph();

我使用两个节点的ID获取它们之间的边:

edge=graph.es.select(_source=id1,_target=id2);

但是,即使图形是无向的,也无法找到从id2到id1的边。因此,我使用了以下方法

edge1=graph.es.select(_source=id1,_target=id2);
edge2=graph.es.select(_source=id2,_target=id1);

if (len(edge1)>len(edge2)):
   edge=edge1;
else:
   edge=edge2;

我的第一个问题:有没有更好的方法来做到这一点?

然而,我的主要问题是更新权重。使用上述代码找到边缘后,我尝试使用以下代码更新其重量:

if (len(edge)==0):
   graph.add_edge(id1,id2);
   edge=graph.es.select(_source=id1,_target=id2);
   edge["weight"]=1;
#else add weight
else:
    print edge.attributes();
    print edge["weight"];
    edge["weight"][0]=edge["weight"][0]+1;

但是,我得到以下错误:

 ...
 ['weight']
 [None]
 Traceback (most recent call last):
   File "/home/ivan/workspace/Twitter/process/MovieGraph.py", line 145, in <module>
     processTweet(g,words);
   File "/home/ivan/workspace/Twitter/process/MovieGraph.py", line 87, in processTweet
     edge["weight"][0]=edge["weight"][0]+1;
 TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

我尝试调试,但看起来边缘存在,但权重没有定义。怎么可能呢?谢谢你。

共有1个答案

咸琪
2023-03-14

关于查找顶点之间的边id1id2:使用get_eid可能更快,因为它完全是用C实现的。您可以执行以下操作:

eid = graph.get_eid(source, target)
edge = graph.es[eid]

(需要第二行,因为get_eid只返回边的ID,而不是边本身)。get_eid也正确处理无向图;换句话说,它总是在两个方向上寻找无向图。

但是,请注意,如果要查找的边不存在,则get_eid会引发异常,因此还应捕获异常并添加边:

try:
    eid = graph.get_eid(source, target)
except igraph.InternalError:
    eid = graph.ecount()
    graph.add_edge(source, target, weight=0)

除了分支利用了这样一个事实,即新添加的边的ID总是等于添加前图中的边的数量,因为边总是从零开始连续编号。请注意,对add_edge的调用也将权重属性的值设置为零,因此您可以简单地在try.之后增加权重。

edge["weight"] += 1

 类似资料:
  • 我在Python3中有一个简单的代码,使用igraph返回我添加到无向图中的边。 但是,如果按照输入源和目标的顺序设置源和目标,它会返回边缘。在这种情况下,源=0,目标=1 我的猜测是,它不是真正的无向图。 我的问题是,如何得到一个真正的无向图,即使我在g.es.find()函数中切换了源节点和目标节点,它也会返回边,就像对无向图一样?

  • 背景:我是图论的新手,特别是“图割”。请不要太技术和速度。谢谢。 假设我有一个加权无向连通图G=(V,E)。我有一个变量a,它包含一个整数值,我想从图G中删除/裁剪所有权重低于a值的边。 问题1:如果图论中已经存在这一点(我看到了max-cut、min-cut、s-t cut,等等),它怎么称呼? 问题2:我如何使用数学符号正式表达/定义这种方法。 谢谢你的建议。

  • 我想知道什么是实现无向加权图的有效方法。我想在上面执行Prims和Kruskal算法。我知道邻接列表,但这不会浪费内存;为。假设我有两个顶点A和B,由权重为“x”的边连接,所以我需要在邻接列表中添加两个条目: 我是不是漏掉了什么?

  • 问题内容: 我在RHEL机器上从源代码安装了python-igraph 0.5.4和igraph 0.5.4(也经过测试0.6)。一切都很好,除非我尝试绘制时得到。 “ TypeError:绘图不可用” 在配置或安装阶段没有错误或警告。 我需要在Linux上安装什么才能使绘图工作?我没有root用户,因此需要从源代码安装它。 问题答案: igraph使用Cairo库进行绘图,因此您将需要Cairo

  • 我尝试使用这里的示例代码在<code>中绘制<code>iGraph<code>网络图,并在我自己的<code>数据中使用shoehorn。帧,而不是使用示例空手道俱乐部数据。绘制图形时,它似乎忽略了边缘列表,并且正在进行一系列随机连接。我认为标签或边缘都是错的,但我不知道。 当我运行这个时,我得到了这个漂亮的iGraph,它由绘制。但是,边是不正确的。似乎只有ID的1-10正在连接,并且只有其他

  • 假设我们有一个加权无向图,其中,对于任意两个顶点,都有一条唯一的路径连接它们。有n个顶点和1个边,每条路的成本是c\u i。 现在,如果连接两个给定顶点的每条路径都有一定的成本,这取决于它所经过的道路,那么我们如何有效地计算所有城市对之间的总成本? 例如,每条道路的成本可以是它经过的第一条道路和最后一条道路的总和,或者是它经过的每条道路的成本的某些幂的总和,或者是成本的最大值减去它经过的道路的最小