是否有一种有效的方法来获取numpy中顶点的发生率?

问题描述

我得到了边的列表。可以像这样从Barabassi graph轻松生成它:

import igraph as ig
import numpy as np
size = 15
g = ig.Graph.Barabasi(n = size,m = 3)
edges = np.array(g.get_edgelist())
ig.plot(g,bbox = (200,200),vertex_label=range(g.vcount()),vertex_size = 12,vertex_label_size = 8)

这是我的输出示例:

enter image description here

我发现在igraph中查找入射节点的方法很简单:

def get_incidences_ig(roads,n):
    g = ig.Graph(roads,n=n)
    return g.get_adjlist()
>>> get_incidences_ig(edges,size)
[[1,2,3,4,5,10,13],[0,6,7,8,9,10],1,11,14],12],3],[1,5],13,[2,[3,7],10]]

现在,我尝试在numpy中实现它:

def get_incidences_np(roads,n):
    roads = np.vstack([roads,roads[:,::-1]])
    # later part is a grouping problem of 2 array with 2 columns: split array into groups by 1st column
    roads_sorted = roads[np.argsort(roads[:,0])]
    marker_idx = np.flatnonzero(np.diff(roads_sorted[:,0])) + 1
    stream = roads_sorted[:,1]
    #sources = roads_sorted[np.r_[0,marker_idx],0]
    targets = np.split(stream,marker_idx)
    return targets

有效。但是,当我尝试在较大的图上运行时(Barabassi图的边缘= 10000,平均度= 3),看来numpy方法的运行速度明显慢:

>>> %timeit get_incidences_np(edges,size)
>>> %timeit get_incidences_ig(edges,size)
64.3 ms ± 22.9 ms per loop (mean ± std. dev. of 7 runs,10 loops each)
10.6 ms ± 233 µs per loop (mean ± std. dev. of 7 runs,100 loops each)

我的numpy方法(roads = np.vstack([roads,::-1]]) +分组拆分)似乎很幼稚。有没有更有效的方法来实现该算法?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...