Julia稀疏矩阵函数中类似于to_scipy_sparse_matrix的功能

4
我想问一下在Julia语言中是否有等价的函数及其functions,用于稀疏矩阵到networkxto_scipy_sparse_matrix的转换。
我正在寻找在eigenvector centrality algorithm中调用此函数的等效方法。
Julia中是否有可能像在eigenvector centrality link中所述那样运行此函数以产生相同的输出?
感谢任何建议。 我已经花费了几个小时来解决这个问题,但是无法得出任何结果。 编辑:
Python version :
import networkx as nx
import scipy

G = nx.Graph()
G.add_edge(1, 2, w=1.0 )
G.add_edge(1, 3, w=0.5 )
G.add_edge(2, 3, w=2.5 )

M = nx.to_scipy_sparse_matrix(G, nodelist=list(G), weight='w',dtype=float)

print(M)

Output:
(0, 1)  1.0
(0, 2)  0.5
(1, 0)  1.0
(1, 2)  2.5
(2, 0)  0.5
(2, 1)  2.5

Julia version:
using Graphs

g1 = Graphs.graph(Graphs.ExVertex[], Graphs.ExEdge{Graphs.ExVertex}[],     is_directed=false)
d = "dist"

v1 = add_vertex!(g1, "a")
v2 = add_vertex!(g1, "b")
v3 = add_vertex!(g1, "c")

e12 = add_edge!(g1, v1, v2)
e12.attributes[d]=1.0

e13 = add_edge!(g1, v1, v3)
e13.attributes[d]=0.5

e23 = add_edge!(g1, v2, v3)
e23.attributes[d]=2.5

如果g是一个图形,可以通过朴素的方式获取稀疏邻接矩阵,即使用Graphs.jl库中的sparse(adjacency_matrix(g)) - Dan Getz
但是如果图是加权的呢?networkx中的函数返回一个矩阵和某种向量,我认为它表示连接或权重。 - M.Puk
如果您包含Julia代码来构建一个样本图,以便生成稀疏矩阵,那将是最简单的(您可以编辑问题)。这些操作通常是巧妙的一行代码。 - Dan Getz
我添加了Julia和Python版本。我想在Julia中复制Python的to_scipy_sparse_matrix函数。 - M.Puk
sparse(weight_matrix(g1,map(x->x.attributes[d],edges(g1)))) 会生成一个稀疏矩阵(但是首先需要经过密集表示)。 - Dan Getz
1个回答

1
尝试以下 Julia 代码(遵循 OP 的代码):

julia> triple(e,d) = (e.source.index,e.target.index,e.attributes[d])
triple (generic function with 1 method)

julia> M = sparse(map(collect,zip([triple(e,d) for e in edges(g1)]...))...,length(g1.vertices),length(g1.vertices))
    2x3 sparse matrix with 3 Float64 entries:
    [1, 2]  =  1.0
    [1, 3]  =  0.5
    [2, 3]  =  2.5
triple 返回一个 (源,目标,d-属性) 三元组,在其他地方可能也会有用。
使用 sparse(I,J,D,rows,cols) 构造函数创建稀疏矩阵,其中 I,J,D 都是相同长度的向量,并且对于它们的每个索引 i,矩阵在位置 I[i],J[i] 上具有 D[i] 值。
如果需要对称权重矩阵,请使用以下内容:
julia> M = M+M'
3x3 sparse matrix with 6 Float64 entries:
    [2, 1]  =  1.0
    [3, 1]  =  0.5
    [1, 2]  =  1.0
    [3, 2]  =  2.5
    [1, 3]  =  0.5
    [2, 3]  =  2.5

请再次提供一下您上次的评论,关于如何在不经过密集表示的情况下生成稀疏矩阵?我想深入了解一下。我会在这个答案中尝试,但我不认为它会给我正确的结果。接下来将从该矩阵计算特征值和特征向量,因此我需要输出与Python中所述的相同。我不确定为什么Python代码中的M矩阵对于在Julia中构建的相同图形具有这样的值。 - M.Puk
那个注释与此处的答案相同(只是没有将“triple”分成单独的函数)。这里和Python的输出是相同的,唯一的区别是稀疏矩阵的打印格式以及Python矩阵是对称的(因此有6个值而不是3个)。将矩阵对称化非常简单,只需执行M = M + M'即可。 - Dan Getz
非常感谢。Python必须从0开始索引矩阵中的顶点,而Julia从1开始,或者我的假设是错误的吗?我想知道这些数字对代表什么。 - M.Puk

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