81 lines
2.1 KiB
Python
81 lines
2.1 KiB
Python
"""Compressed Sparse graph algorithms"""
|
|
# Backported from scipy 0.9: scipy.sparse.csgraph
|
|
|
|
# Some compatibility fixes for scipy 0.6
|
|
# Fabian Pedregosa, October 2010
|
|
|
|
__docformat__ = "restructuredtext en"
|
|
|
|
__all__ = ['cs_graph_components']
|
|
|
|
import numpy as np
|
|
|
|
from .sparsetools import cs_graph_components as _cs_graph_components
|
|
|
|
from scipy.sparse import csr_matrix
|
|
from scipy.sparse import isspmatrix
|
|
|
|
_msg0 = 'x must be a symmetric square matrix!'
|
|
_msg1 = _msg0 + '(has shape %s)'
|
|
|
|
|
|
def cs_graph_components(x):
|
|
"""
|
|
Determine connected compoments of a graph stored as a compressed sparse row
|
|
or column matrix. For speed reasons, the symmetry of the matrix x is not
|
|
checked.
|
|
|
|
Parameters
|
|
----------
|
|
x: ndarray-like, 2 dimensions, or sparse matrix
|
|
The adjacency matrix of the graph. Only the upper triangular part
|
|
is used.
|
|
|
|
Returns
|
|
-------
|
|
n_components: int
|
|
The number of connected components.
|
|
label: ndarray (ints, 1 dimension):
|
|
The label array of each connected component (-2 is used to
|
|
indicate empty rows: 0 everywhere, including diagonal).
|
|
|
|
Notes
|
|
-----
|
|
|
|
The matrix is assumed to be symmetric and the upper triangular part
|
|
of the matrix is used. The matrix is converted to a CSR matrix unless
|
|
it is already a CSR.
|
|
|
|
Examples
|
|
--------
|
|
|
|
>>> from scipy.sparse import cs_graph_components
|
|
>>> import numpy as np
|
|
>>> D = np.eye(4)
|
|
>>> D[0,1] = D[1,0] = 1
|
|
>>> cs_graph_components(D)
|
|
(3, array([0, 0, 1, 2]))
|
|
>>> from scipy.sparse import dok_matrix
|
|
>>> cs_graph_components(dok_matrix(D))
|
|
(3, array([0, 0, 1, 2]))
|
|
|
|
"""
|
|
try:
|
|
shape = x.shape
|
|
except AttributeError:
|
|
raise ValueError(_msg0)
|
|
|
|
if not ((len(x.shape) == 2) and (x.shape[0] == x.shape[1])):
|
|
raise ValueError(_msg1 % x.shape)
|
|
|
|
if isspmatrix(x):
|
|
x = x.tocsr()
|
|
else:
|
|
x = csr_matrix(x)
|
|
|
|
label = np.empty((shape[0],), dtype=x.indptr.dtype)
|
|
|
|
n_components = _cs_graph_components(shape[0], x.indptr, x.indices, label)
|
|
|
|
return n_components, label
|