微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决是否有一种有效的方法来获取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 举报,一经查实,本站将立刻删除。