SciPy 图表
使用图表
图表是一种基本的数据结构。
SciPy 为我们提供了模块 scipy.sparse.csgraph
用于处理此类数据结构。
邻接矩阵
邻接矩阵是一个 nxn
矩阵,其中 n
是图中元素的数量。 p>
而数值代表元素之间的联系。
例子:
对于这样的图,具有元素 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)。
- 索引:元素的索引,仅返回来自该元素的所有路径。
- 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
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))
亲自试一试 »