Python igraph:从图中删除顶点。

10

我正在使用安然公司的电子邮件数据集,尝试删除没有"@enron.com"的电子邮件地址(即只想保留安然公司的电子邮件)。当我尝试删除没有@enron.com的地址时,由于某些原因一些电子邮件被跳过了。下面显示了一个小图,其中顶点是电子邮件地址。这是gml格式:

Creator "igraph version 0.7 Sun Mar 29 20:15:45 2015"
Version 1
graph
[
  directed 1
  node
  [
    id 0
    label "csutter@enron.com"
  ]
  node
  [
    id 1
    label "steve_williams@eogresources.com"
  ]
  node
  [
    id 2
    label "kutner.stephen@enron.com"
  ]
  node
  [
    id 3
    label "igsinc@ix.netcom"
  ]
  node
  [
    id 4
    label "dbn@felesky.com"
  ]
  node
  [
    id 5
    label "cheryltd@tbardranch.com"
  ]
  node
  [
    id 6
    label "slover.eric@enron.com"
  ]
  node
  [
    id 7
    label "alkeister@yahoo.com"
  ]
  node
  [
    id 8
    label "econnors@mail.mainland.cc.tx.us"
  ]
  node
  [
    id 9
    label "jafry@hotmail.com"
  ]
  edge
  [
    source 5
    target 5
    weight 1
  ]
]

我的代码是:

G = ig.read("enron_email_filtered.gml")
for v in G.vs:
    print v['label']
    if '@enron.com' not in v['label']:
        G.delete_vertices(v.index)
        print 'Deleted'

在这个数据集中,应该删除7封电子邮件。然而,根据上面的代码,只有5封电子邮件被移除。


1
我认为在迭代G.vs时不允许删除顶点。尝试先收集它们,然后一次性删除所有顶点。 - Jan Katins
没错 - 在迭代 G.vs 时修改顶点集会产生不可预测的结果。 - Tamás
1个回答

8

这里的教程中,您可以通过特定属性访问所有顶点,然后按以下方式批量删除它们:

to_delete_ids = [v.index for v in G.vs if '@enron.com' not in v['label']]
G.delete_vertices(to_delete_ids)

这是我得到的输出结果:
to delete ids: [1, 3, 4, 5, 7, 8, 9]
Before deletion: IGRAPH D-W- 10 1 --
+ attr: id (v), label (v), weight (e)
+ edges:
5->5
After deletion: IGRAPH D-W- 3 0 --
+ attr: id (v), label (v), weight (e)
label: csutter@enron.com
label: kutner.stephen@enron.com
label: slover.eric@enron.com

2
我有一个类似的问题,但我想删除没有边的顶点。类似于 to delete_ids = [v.index for v in g_groups_all.vs if v HAS NO EDGES] 有什么想法吗?@Jey @Brian Tompsett? - B Furtado
4
@B_Furtado 使用 g.vs.find(_degree=0)。 - M.M
要获取孤立点列表,您可以执行类似以下的操作:[v.index for v in g.vs if v.degree() == 0] - Mark Graph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接