Python Tutorial
SciPy Graphs
scipy.sparse.csgraph works on graphs stored as sparse matrices: shortest path, connected components.
Shortest Path
import numpy as np
from scipy.sparse.csgraph import shortest_path
from scipy.sparse import csr_matrix
graph = csr_matrix([
[0, 1, 2, 0],
[0, 0, 0, 1],
[0, 0, 0, 3],
[0, 0, 0, 0],
])
dist = shortest_path(csgraph=graph, directed=False)
print(dist)Connected Components
from scipy.sparse.csgraph import connected_components
n, labels = connected_components(csgraph=graph, directed=False)
print(n, labels)📘 Real-World Deep Dive
Knowing <strong>SciPy Graphs (SciPy)</strong> well is what turns SciPy from a curiosity into a daily tool — you'll reach for it in nearly every real project.
Real-Life Scenario
An end-to-end usage of SciPy Graphs that you'd actually see in a data pipeline or analytics notebook.
Real-Life Example
import numpy as np
from scipy.sparse.csgraph import shortest_path
graph = np.array([[0, 1, 0], [1, 0, 1], [0, 1, 0]])
print(shortest_path(graph, method="Dijkstra"))Expected Output
(see source)Common mistakes
- Many SciPy functions take
methodstrings with subtle spelling differences ("trust-constr"vs."trust-constr") — readscipy.optimize.least_squaresdocs. - Sparse matrices need explicit conversion to dense (
toarray()) before being fed to functions that don't acceptscipy.sparse. scipy.signalfunctions often return arrays whose length differs from input — always inspectlen(out)defensively.- Treating SciPy Graphs as a black box without reading the docs — the API has subtle defaults that bite when you scale.
🚀 Performance & Best Practices
- Use vectorised
scipy.statsdistributions instead of looping per-sample for large parametric studies. scipy.sparse.csr_matrixis the right format for arithmetic;csc_matrixis right for slicing columns.- Prefer Cython/Numba (or NumPy ufuncs) over Python loops inside SciPy callbacks (e.g.
odeint). - When working with SciPy, prefer vectorised / batched operations over Python loops.
🧪 Try It Yourself
- Reproduce the snippet on a representative slice of your own data.
- Profile the snippet with
cProfileortimeitand find the single biggest improvement. - Generalise the snippet into a small, reusable function you can drop into future projects.