我有两个数据帧df1
和df2
,其中包含两个网络的边缘列表g1
和{
我定义了计算jaccard索引的函数
def compute_jaccard_index(set_1, set_2):
n = len(set_1.intersection(set_2))
return n / float(len(set_1) + len(set_2) - n)
df1
i j
0 0 2
1 0 5
2 1 2
3 2 3
4 2 4
5 2 7
df2
i j
0 0 2
1 0 5
2 0 1
3 1 3
4 2 4
5 2 7
我正在做的是:
^{pr2}$我想知道有没有更有效的方法
我发现利用scipy的稀疏矩阵和向量化操作比依赖python的set函数更快。这里有一个简单的函数 数据帧边缘列表成稀疏矩阵(有向和无向):
那么这只是对二元邻接矩阵的简单向量运算:
^{pr2}$为了进行比较,我制作了一个随机pandas edge list函数,并将代码打包成以下函数:
然后,我们可以通过建立两个随机网络来比较运行时:
以及使用基于集合的方法计算每个节点的Jaccard相似性:
以及稀疏方法(包括转换为稀疏矩阵的开销):
你可以看到稀疏矩阵快1000倍。在
相关问题
PyPI热门下载资源包