attr_matrix#

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

使用 G 的属性返回属性矩阵,作为 numpy 数组。

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

设 A 是节点属性 node_attr 的一组离散值。则 A 中的元素代表所构建矩阵的行和列。现在,遍历 G 中的每条边 e=(u,v),并考虑边属性 edge_attr 的值。如果 ua 和 va 分别是节点 u 和 v 的节点属性 node_attr 的值,则将边属性的值添加到矩阵中位置 (ua, va) 的元素上。

参数:
G

用于构建属性矩阵的 NetworkX 图。

edge_attrstr, 可选

矩阵的每个元素代表对应于矩阵行/列的节点属性的边的指定边属性的累加总和。该属性必须存在于图中的所有边。如果未指定属性,则仅计算节点属性对应于矩阵元素的边的数量。

node_attrstr, 可选

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

normalizedbool, 可选

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

rc_orderlist, 可选

节点属性值的列表。此列表指定数组的行和列的顺序。如果未提供顺序,则顺序将是随机的(同时也是返回值)。

返回:
M二维 NumPy ndarray

属性矩阵。

orderinglist

如果指定了 rc_order,则只返回属性矩阵。但是,如果 rc_order 为 None,则同时返回用于构建矩阵的顺序。

其他参数:
dtypeNumPy 数据类型, 可选

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

order{‘C’, ‘F’}, 可选

是否以 C 连续(按行)或 Fortran 连续(按列)顺序在内存中存储多维数据。此参数传递给 numpy.zeros()。如果未指定,则使用 NumPy 默认值。

示例

构建邻接矩阵

>>> 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)
>>> nx.attr_matrix(G, rc_order=[0, 1, 2])
array([[0., 1., 1.],
       [1., 0., 1.],
       [1., 1., 0.]])

或者,我们可以获得描述边权重的矩阵。

>>> nx.attr_matrix(G, edge_attr="thickness", rc_order=[0, 1, 2])
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"]
>>> nx.attr_matrix(G, node_attr="color", normalized=True, rc_order=rc)
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

最后,我们可以根据节点颜色获得总权重列表。

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

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

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