SciPy 图结构

使用图结构

图(Graph)是一种基本的数据结构。

SciPy 为我们提供了用于处理此类数据结构的模块 scipy.sparse.csgraph


邻接矩阵

邻接矩阵是一个 nxn 矩阵,其中 n 是图形中的元素数。

这些值表示元素之间的连接。

比如:

在这个例子中,顶点有 A、B、C,边权重有 1 和 2。

A 与 B 是连接的,权重为 1。

A 与 C 是连接的,权重为 2。

C 与 B 是没有连接的。

这个邻接矩阵可以表示为以下二维数组:

  1. A B C
  2. A:[0 1 2]
  3. B:[1 0 0]
  4. C:[2 0 0]

连接的组件

使用 connected_components() 方法查找所有连接的组件。

实例
  1. import numpy as np
  2. from scipy.sparse.csgraph import connected_components
  3. from scipy.sparse import csr_matrix
  4. arr = np.array([
  5. [0, 1, 2],
  6. [1, 0, 0],
  7. [2, 0, 0]
  8. ])
  9. newarr = csr_matrix(arr)
  10. print(connected_components(newarr))

最短路径算法

使用 dijkstra 方法查找图形中从一个元素到另一个元素的最短路径。

它采用以下参数:

return_predecessors:布尔值(True,返回遍历的整个路径,否则为False)

indices:元素的索引,仅返回该元素的所有路径。

limit:路径的最大权重。

实例

找到从元素 1 到元素 2 的最短路径:

  1. import numpy as np
  2. from scipy.sparse.csgraph import dijkstra
  3. from scipy.sparse import csr_matrix
  4. arr = np.array([
  5. [0, 1, 2],
  6. [1, 0, 0],
  7. [2, 0, 0]
  8. ])
  9. newarr = csr_matrix(arr)
  10. print(dijkstra(newarr, return_predecessors=True, indices=0))

Floyd Warshall - 弗洛伊德算法

弗洛伊德算法 是解决任意两点间的最短路径的一种算法。

使用 floyd_warshall() 方法查找所有成对元素之间的最短路径。

实例

查找所有元素对之间的最短路径:

  1. import numpy as np
  2. from scipy.sparse.csgraph import floyd_warshall
  3. from scipy.sparse import csr_matrix
  4. arr = np.array([
  5. [0, 1, 2],
  6. [1, 0, 0],
  7. [2, 0, 0]
  8. ])
  9. newarr = csr_matrix(arr)
  10. print(floyd_warshall(newarr, return_predecessors=True))

Bellman Ford - 贝尔曼-福特算法

bellman_ford() 方法可以找到所有元素对之间的最短路径,但该方法也可以处理负权重。

实例

使用给定的具有负权重的图,查找从元素 1 到元素 2 的最短路径:

  1. import numpy as np
  2. from scipy.sparse.csgraph import bellman_ford
  3. from scipy.sparse import csr_matrix
  4. arr = np.array([
  5. [0, -1, 2],
  6. [1, 0, 0],
  7. [2, 0, 0]
  8. ])
  9. newarr = csr_matrix(arr)
  10. print(bellman_ford(newarr, return_predecessors=True, indices=0))

深度优先顺序

depth_first_order() 方法从节点返回深度优先遍历的顺序。

此函数采用以下参数:

  • 图开始遍历的元素
实例

对于给定的邻接矩阵,首先遍历图形深度:

  1. import numpy as np
  2. from scipy.sparse.csgraph import depth_first_order
  3. from scipy.sparse import csr_matrix
  4. arr = np.array([
  5. [0, 1, 0, 1],
  6. [1, 1, 1, 1],
  7. [2, 1, 1, 0],
  8. [0, 1, 0, 1]
  9. ])
  10. newarr = csr_matrix(arr)
  11. print(depth_first_order(newarr, 1))

广度优先顺序

breadth_first_order() 方法从一个节点返回广度优先遍历的顺序。

此函数采用以下参数:

  • 图开始遍历的元素
实例

对于给定的邻接矩阵,首先遍历图的广度:

  1. import numpy as np
  2. from scipy.sparse.csgraph import breadth_first_order
  3. from scipy.sparse import csr_matrix
  4. arr = np.array([
  5. [0, 1, 0, 1],
  6. [1, 1, 1, 1],
  7. [2, 1, 1, 0],
  8. [0, 1, 0, 1]
  9. ])
  10. newarr = csr_matrix(arr)
  11. print(breadth_first_order(newarr, 1))