Skip to main content
`Ctrl`+`K`
scipy.spatial.cKDTree.

# sparse_distance_matrix

cKDTree.sparse_distance_matrix(other, max_distance, p=2.0, output_type='dok_matrix')

  Compute a sparse distance matrix

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

  Parameters:
    other cKDTree

      The other `KDTree` to compute distances against.

    max_distance positive float

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

    p float, 1<=p<=infinity

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

    output_type str, 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.

  Returns:
    result dok_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 cKDTree
      >>> rng = np.random.default_rng()
      >>> points1 = rng.random((5, 2))
      >>> points2 = rng.random((5, 2))
      >>> kdtree1 = cKDTree(points1)
      >>> kdtree2 = cKDTree(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.distance import cdist
      >>> cdist(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 ]])