SciPy 图表
使用图表
图表是一种基本的数据结构。
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
使用 dijkstra
方法在图中从一个元素到另一个元素找到最短路径。
它采用以下参数
- **return_predecessors:** 布尔值(如果返回整个遍历路径,则为 True,否则为 False)。
- **indices:** 要返回所有路径的元素的索引。
- **limit:** 路径的最大权重。
示例
查找从元素 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
使用 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
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))
自己试试 »