Guest User

Untitled

a guest
Jan 20th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.19 KB | None | 0 0
  1. import numpy as np
  2. from scipy.spatial import distance
  3.  
  4. def add_points_to_distance_matrix(points, original_array, distance_matrix, metric='euclidean'):
  5. """
  6. There is an NxM array of points, a square matrix NxN with distances between points.
  7. This function adds new points to the distance matrix.
  8. We need to create a diagonal block holding distances between the new points
  9. and two identical blocks holding distances to original array.
  10. E.g.
  11. original_array = ([[1,2,3],[1,2,4],[1,2,5]])
  12. distance_matrix = distance.squareform(distance.pdist(original_array))
  13. >>> distance_matrix
  14. array([[0., 1., 2.],
  15. [1., 0., 1.],
  16. [2., 1., 0.]])
  17. >>> add_points_to_distance_matrix([[1,2,5],[1,2,5]], original_array,distance_matrix)
  18. array([[0., 1., 2., 2., 2.],
  19. [1., 0., 1., 1., 1.],
  20. [2., 1., 0., 0., 0.],
  21.  
  22. [2., 1., 0., 0., 0.],
  23. [2., 1., 0., 0., 0.]])
  24.  
  25. """
  26. diagonal = distance.squareform(distance.pdist(points, metric=metric))
  27. twin_block = distance.cdist(original_array, points, metric=metric)
  28. return (np.vstack([np.hstack([distance_matrix,twin_block]), np.hstack([twin_block.T, diagonal])]))
Add Comment
Please, Sign In to add comment