图是一种重要的数据结构。
SciPy为我们提供了模块scipy.sparse.csgraph
用于处理此类数据结构。
邻接矩阵是nxn
矩阵其中n
是图中元素的数量。
值代表元素之间的联系。
例子:
对于这样的图,具有元素 A、B 和 C,连接为:
A 和 B 与权重 1 连接。
A 和 C 与权重 2 连接。
C 和 B 未连接。
邻接矩阵如下所示:
A B C A:[0 1 2] B:[1 0 0] C:[2 0 0]
下面是一些最常用的处理邻接矩阵的方法。
connected_components()
import numpy as np
from scipy.sparse.csgraph import connected_components
from scipy.sparse import csr_matrix
arr = np.array([
[0, 1, 2],
[1, 0, 0],
[2, 0, 0]
])
newarr = csr_matrix(arr)
print(connected_components(newarr))
亲自试一试 »
使用dijkstra
一种查找图中从一个元素到另一个元素的最短路径的方法。
它需要以下参数:
求从元素 1 到元素 2 的最短路径:
import numpy as np
from scipy.sparse.csgraph import dijkstra
from scipy.sparse import csr_matrix
arr = np.array([
[0, 1, 2],
[1, 0, 0],
[2, 0, 0]
])
newarr = csr_matrix(arr)
print(dijkstra(newarr, return_predecessors=True, indices=0))
亲自试一试 »
使用floyd_warshall()
寻找所有元素对之间的最短路径的方法。
找到所有元素对之间的最短路径:
import numpy as np
from scipy.sparse.csgraph import floyd_warshall
from scipy.sparse import csr_matrix
arr = np.array([
[0, 1, 2],
[1, 0, 0],
[2, 0, 0]
])
newarr = csr_matrix(arr)
print(floyd_warshall(newarr, return_predecessors=True))
亲自试一试 »
这个bellman_ford()
方法还可以找到所有元素对之间的最短路径,但该方法也可以处理负权重。
使用给定的负权重图查找从元素 1 到元素 2 的最短路径:
import numpy as np
from scipy.sparse.csgraph import bellman_ford
from scipy.sparse import csr_matrix
arr = np.array([
[0, -1, 2],
[1, 0, 0],
[2, 0, 0]
])
newarr = csr_matrix(arr)
print(bellman_ford(newarr, return_predecessors=True, indices=0))
亲自试一试 »
这个depth_first_order()
方法返回从节点开始的深度优先遍历。
该函数采用以下参数:
对于给定的邻接矩阵,首先遍历图深度:
import numpy as np
from scipy.sparse.csgraph import depth_first_order
from scipy.sparse import csr_matrix
arr = np.array([
[0, 1, 0, 1],
[1, 1, 1, 1],
[2, 1, 1, 0],
[0, 1, 0, 1]
])
newarr = csr_matrix(arr)
print(depth_first_order(newarr, 1))
亲自试一试 »
这个breadth_first_order()
方法返回从节点开始的广度优先遍历。
该函数采用以下参数:
对于给定的邻接矩阵,首先遍历图的宽度:
import numpy as np
from scipy.sparse.csgraph import breadth_first_order
from scipy.sparse import csr_matrix
arr = np.array([
[0, 1, 0, 1],
[1, 1, 1, 1],
[2, 1, 1, 0],
[0, 1, 0, 1]
])
newarr = csr_matrix(arr)
print(breadth_first_order(newarr, 1))
亲自试一试 »