scipy.cluster.hierarchy.

is_isomorphic#

scipy.cluster.hierarchy.is_isomorphic(T1, T2)[source]#

Determine if two different cluster assignments are equivalent.

Parameters:
T1array_like

An assignment of singleton cluster ids to flat cluster ids.

T2array_like

An assignment of singleton cluster ids to flat cluster ids.

Returns:
bbool

Whether the flat cluster assignments T1 and T2 are equivalent.

See also

linkage

for a description of what a linkage matrix is.

fcluster

for the creation of flat cluster assignments.

Notes

Array API support (experimental): If the input is a lazy Array (e.g. Dask or JAX), the return value will be a 0-dimensional bool Array.

is_isomorphic has experimental support for Python Array API Standard compatible backends in addition to NumPy. Please consider testing these features by setting an environment variable SCIPY_ARRAY_API=1 and providing CuPy, PyTorch, JAX, or Dask arrays as array arguments. The following combinations of backend and device (or other capability) are supported.

Library

CPU

GPU

NumPy

n/a

CuPy

n/a

PyTorch

JAX

⚠️ see notes

Dask

⚠️ see notes

n/a

See Support for the array API standard for more information.

Examples

>>> from scipy.cluster.hierarchy import fcluster, is_isomorphic
>>> from scipy.cluster.hierarchy import single, complete
>>> from scipy.spatial.distance import pdist

Two flat cluster assignments can be isomorphic if they represent the same cluster assignment, with different labels.

For example, we can use the scipy.cluster.hierarchy.single method and flatten the output to four clusters:

>>> X = [[0, 0], [0, 1], [1, 0],
...      [0, 4], [0, 3], [1, 4],
...      [4, 0], [3, 0], [4, 1],
...      [4, 4], [3, 4], [4, 3]]
>>> Z = single(pdist(X))
>>> T = fcluster(Z, 1, criterion='distance')
>>> T
array([3, 3, 3, 4, 4, 4, 2, 2, 2, 1, 1, 1], dtype=int32)

We can then do the same using the scipy.cluster.hierarchy.complete: method:

>>> Z = complete(pdist(X))
>>> T_ = fcluster(Z, 1.5, criterion='distance')
>>> T_
array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4], dtype=int32)

As we can see, in both cases we obtain four clusters and all the data points are distributed in the same way - the only thing that changes are the flat cluster labels (3 => 1, 4 =>2, 2 =>3 and 4 =>1), so both cluster assignments are isomorphic:

>>> is_isomorphic(T, T_)
True