attr_sparse_matrix#

attr_sparse_matrix(G, edge_attr=None, node_attr=None, normalized=False, rc_order=None, dtype=None)[source]#

返回一个使用G的属性构建的SciPy稀疏数组。

如果仅传入 G ,则构建邻接矩阵。

设A为节点属性 node_attr 的离散值集合。那么A的元素表示构建矩阵的行和列。现在,遍历 G 中的每条边e=(u,v)并考虑边属性 edge_attr 的值。如果ua和va分别是节点u和v的节点属性 node_attr 的值,那么边属性的值将添加到矩阵元素(ua, va)中。

Parameters:
G

用于构建NumPy矩阵的NetworkX图。

edge_attrstr, 可选

矩阵的每个元素表示指定边属性的累计值,这些边属性的节点属性对应于矩阵的行/列。该属性必须存在于图中的所有边上。如果没有指定属性,则我们只计算节点属性对应于矩阵元素的边的数量。

node_attrstr, 可选

矩阵的每一行和每一列表示节点属性的特定值。该属性必须存在于图中的所有节点上。注意,此属性的值应该是可靠的可哈希的。因此,不建议使用浮点值。如果没有指定属性,则行和列将是图的节点。

normalizedbool, 可选

如果为True,则每一行按其值的总和进行归一化。

rc_orderlist, 可选

节点属性值的列表。此列表指定数组的行和列的顺序。如果没有提供顺序,则顺序将是随机的(并且也是一个返回值)。

Returns:
MSciPy稀疏数组

属性矩阵。

orderinglist

如果指定了 rc_order ,则仅返回矩阵。然而,如果 rc_order 为None,则还会返回用于构建矩阵的顺序。

Other Parameters:
dtypeNumPy数据类型, 可选

用于初始化数组的有效NumPy数据类型。请记住,某些数据类型如果在归一化数组时可能会产生意外结果。该参数传递给numpy.zeros()。如果未指定,则使用NumPy默认值。

Examples

构建一个邻接矩阵:

>>> G = nx.Graph()
>>> G.add_edge(0, 1, thickness=1, weight=3)
>>> G.add_edge(0, 2, thickness=2)
>>> G.add_edge(1, 2, thickness=3)
>>> M = nx.attr_sparse_matrix(G, rc_order=[0, 1, 2])
>>> M.toarray()
array([[0., 1., 1.],
       [1., 0., 1.],
       [1., 1., 0.]])

或者,我们可以获取描述边厚度的矩阵。

>>> M = nx.attr_sparse_matrix(G, edge_attr="thickness", rc_order=[0, 1, 2])
>>> M.toarray()
array([[0., 1., 2.],
       [1., 0., 3.],
       [2., 3., 0.]])

我们还可以给节点上色并获取所有边(u,v)的概率分布,描述:

Pr(v有颜色Y | u有颜色X)

>>> G.nodes[0]["color"] = "red"
>>> G.nodes[1]["color"] = "red"
>>> G.nodes[2]["color"] = "blue"
>>> rc = ["red", "blue"]
>>> M = nx.attr_sparse_matrix(G, node_attr="color", normalized=True, rc_order=rc)
>>> M.toarray()
array([[0.33333333, 0.66666667],
       [1.        , 0.        ]])

例如,上述结果告诉我们对于所有边(u,v):

Pr( v是红色 | u是红色) = 1/3 Pr( v是蓝色 | u是红色) = 2/3

Pr( v是红色 | u是蓝色) = 1 Pr( v是蓝色 | u是蓝色) = 0

最后,我们可以获取按节点颜色列出的总权重。

>>> M = nx.attr_sparse_matrix(G, edge_attr="weight", node_attr="color", rc_order=rc)
>>> M.toarray()
array([[3., 2.],
       [2., 0.]])

因此,所有边(u,v)的总权重,其中u和v具有颜色:

(红色, 红色) 是 3 # 唯一的贡献来自边(0,1) (红色, 蓝色) 是 2 # 来自边(0,2)和(1,2)的贡献 (蓝色, 红色) 是 2 # 与(红色, 蓝色)相同,因为图是无向的 (蓝色, 蓝色) 是 0 # 没有蓝色端点的边