scipy.spatial.KDTree.

sparse_distance_matrix#

KDTree.sparse_distance_matrix(other, max_distance, p=2.0, output_type='dok_matrix')[source]#

Compute a sparse distance matrix.

Computes a distance matrix between two KDTrees, leaving as zero any distance greater than max_distance.

Parameters:
otherKDTree

The other KDTree to compute distances against.

max_distancepositive float

Maximum distance within which neighbors are returned. Distances above this value are returned as zero.

pfloat, 1<=p<=infinity

Which Minkowski p-norm to use. A finite large p may cause a ValueError if overflow can occur.

output_typestr, optional

Which container to use for output data. Options: 'dok_array', 'coo_array', 'dict', or 'ndarray'. Legacy options 'dok_matrix' and 'coo_matrix' are still available. Default: 'dok_matrix'.

Warning

dok_matrix and coo_matrix are being replaced.

All new code using scipy sparse should use sparse array types ‘dok_array’ or ‘coo_array’. The default value of output_type will be deprecated at v1.19 and switch from ‘dok_matrix’ to ‘dok_array’ in v1.21. The values ‘dok_matrix’ and ‘coo_matrix’ continue to work, but will go away eventually.

Added in version 1.6.0.

Returns:
resultdok_array, coo_array, dict or ndarray

Sparse matrix representing the results in “dictionary of keys” format. If a dict is returned the keys are (i,j) tuples of indices. If output_type is 'ndarray' a record array with fields 'i', 'j', and 'v' is returned,

Examples

You can compute a sparse distance matrix between two kd-trees:

>>> import numpy as np
>>> from scipy.spatial import KDTree
>>> rng = np.random.default_rng()
>>> points1 = rng.random((5, 2))
>>> points2 = rng.random((5, 2))
>>> kdtree1 = KDTree(points1)
>>> kdtree2 = KDTree(points2)
>>> sdm = kdtree1.sparse_distance_matrix(kdtree2, 0.3, output_type="dok_array")
>>> sdm.toarray()
array([[0.        , 0.        , 0.12295571, 0.        , 0.        ],
   [0.        , 0.        , 0.        , 0.        , 0.        ],
   [0.28942611, 0.        , 0.        , 0.2333084 , 0.        ],
   [0.        , 0.        , 0.        , 0.        , 0.        ],
   [0.24617575, 0.29571802, 0.26836782, 0.        , 0.        ]])

You can check distances above the max_distance are zeros:

>>> from scipy.spatial import distance_matrix
>>> distance_matrix(points1, points2)
array([[0.56906522, 0.39923701, 0.12295571, 0.8658745 , 0.79428925],
   [0.37327919, 0.7225693 , 0.87665969, 0.32580855, 0.75679479],
   [0.28942611, 0.30088013, 0.6395831 , 0.2333084 , 0.33630734],
   [0.31994999, 0.72658602, 0.71124834, 0.55396483, 0.90785663],
   [0.24617575, 0.29571802, 0.26836782, 0.57714465, 0.6473269 ]])