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
中的节点顺序排列。如果nodelist
是None
,则顺序由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
另请参阅
说明
对于有向图,条目
i, j
对应于从i
到j
的边。邻接矩阵中的条目由
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.]])