to_numpy_array#

to_numpy_array(G, nodelist=None, dtype=None, order=None, multigraph_weight=<built-in function sum>, weight='weight', nonedge=0.0)[source]#

将图的邻接矩阵返回为 NumPy 数组。

参数:
G

用于构建 NumPy 数组的 NetworkX 图。

nodelist列表, 可选

行和列按照 nodelist 中的节点顺序排列。如果 nodelistNone,则顺序由 G.nodes() 生成。

dtypeNumPy 数据类型, 可选

用于初始化数组的 NumPy 数据类型。如果为 None,则使用 NumPy 的默认类型。如果 weight=None,则 dtype 可以是结构化的,在这种情况下,使用 dtype 字段名称来查找边属性。结果是一个结构化数组,其中 dtype 中的每个命名字段对应于该边属性的邻接关系。详情请参见示例。

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

是否在内存中以 C 连续(行优先)或 Fortran 连续(列优先)顺序存储多维数据。如果为 None,则使用 NumPy 的默认值。

multigraph_weight可调用对象, 可选

一个函数,用于确定如何处理多重图中的权重。该函数应接受一个权重序列并返回一个单一值。默认是求和多重边的权重。

weight字符串或 None, 可选 (默认 = ‘weight’)

用于存储边权重的数值的边属性。如果边没有该属性,则使用值 1。如果使用了结构化 dtype,则 weight 必须为 None

nonedge类数组 (默认 = 0.0)

用于表示邻接矩阵中非边的值。对应于非边的数组值通常设置为零。但是,如果存在对应于实际边的数组值也为零,这可能会导致混淆。在这种情况下,可能倾向于将非边设置为其他值,例如 nan

返回值:
ANumPy ndarray

图的邻接矩阵

引发:
NetworkXError

如果 dtype 是结构化 dtype 且 G 是多重图

ValueError

如果 dtype 是结构化 dtype 且 weight 不是 None

另请参阅

from_numpy_array

说明

对于有向图,条目 i, j 对应于从 ij 的边。

邻接矩阵中的条目由 weight 边属性给出。如果边没有 weight 属性,则该条目的值设置为 1。对于多重(平行)边,条目的值由 multigraph_weight 参数确定。默认是求和每条平行边的 weight 属性。

nodelist 不包含 G 中的所有节点时,邻接矩阵由 G 中由 nodelist 中的节点导出的子图构建。

图中用于处理自环边的惯例是将对角线数组条目值赋给边的 weight 属性(如果边没有 weight 属性则赋为 1)。如果需要采用将边权重加倍的替代惯例,可以如下修改生成的 NumPy 数组:

>>> import numpy as np
>>> G = nx.Graph([(1, 1)])
>>> A = nx.to_numpy_array(G)
>>> A
array([[1.]])
>>> A[np.diag_indices_from(A)] *= 2
>>> A
array([[2.]])

示例

>>> G = nx.MultiDiGraph()
>>> G.add_edge(0, 1, weight=2)
0
>>> G.add_edge(1, 0)
0
>>> G.add_edge(2, 2, weight=3)
0
>>> G.add_edge(2, 2)
1
>>> nx.to_numpy_array(G, nodelist=[0, 1, 2])
array([[0., 2., 0.],
       [1., 0., 0.],
       [0., 0., 4.]])

使用 nodelist 参数时,G 中未出现在 nodelist 中的节点及其边不会包含在邻接矩阵中。示例如下:

>>> G = nx.Graph()
>>> G.add_edge(3, 1)
>>> G.add_edge(2, 0)
>>> G.add_edge(2, 1)
>>> G.add_edge(3, 0)
>>> nx.to_numpy_array(G, nodelist=[1, 2, 3])
array([[0., 1., 1.],
       [1., 0., 0.],
       [1., 0., 0.]])

此函数还可用于为具有结构化 dtypes 的多个边属性创建邻接矩阵

>>> G = nx.Graph()
>>> G.add_edge(0, 1, weight=10)
>>> G.add_edge(1, 2, cost=5)
>>> G.add_edge(2, 3, weight=3, cost=-4.0)
>>> dtype = np.dtype([("weight", int), ("cost", float)])
>>> A = nx.to_numpy_array(G, dtype=dtype, weight=None)
>>> A["weight"]
array([[ 0, 10,  0,  0],
       [10,  0,  1,  0],
       [ 0,  1,  0,  3],
       [ 0,  0,  3,  0]])
>>> A["cost"]
array([[ 0.,  1.,  0.,  0.],
       [ 1.,  0.,  5.,  0.],
       [ 0.,  5.,  0., -4.],
       [ 0.,  0., -4.,  0.]])

如上所述,参数“nonedge”尤其在图中有实际权重为 0 的边时非常有用。将 nonedge 值设置为非 0,可以更清楚地区分这些权重为 0 的边和实际的非边值。

>>> G = nx.Graph()
>>> G.add_edge(3, 1, weight=2)
>>> G.add_edge(2, 0, weight=0)
>>> G.add_edge(2, 1, weight=0)
>>> G.add_edge(3, 0, weight=1)
>>> nx.to_numpy_array(G, nonedge=-1.0)
array([[-1.,  2., -1.,  1.],
       [ 2., -1.,  0., -1.],
       [-1.,  0., -1.,  0.],
       [ 1., -1.,  0., -1.]])