Вы на правильном пути, используя для этого Numpy. Я лично нашел Numpy очень не интуитивным, когда я впервые использовал его, но с практикой это становится (немного) легче.
Основная идея заключается в том, что вы хотите избежать циклов и использовать векторизованные операции. Это позволяет значительно быстрее выполнять операции с большими структурами данных.
На части векторизации широковещание - где Numpy может применять операции над объектами различной формы. Так что в этом случае вы можете вычесть без цикла:
import numpy as np
starting_point = np.array([1.0, 2.0])
list_of_points = np.array([[4, 6], [5, 5], [3, 2]])
# subtract starting_point from each point in list_of_points
dif = list_of_points - starting_point
Если вы покопаетесь в документах, вы найдете все виды векторизованных операций, включая np.linalg.norm()
( документы ), которые вычисляют различные виды норм, включая расстояния. Хитрость в использовании этого заключается в том, чтобы выяснить, какую ось использовать. Я изменил значения, чтобы было легче подтверждать правильные ответы:
import numpy as np
starting_point = np.array([1.0, 2.0])
list_of_points = np.array([[4, 6], [5, 5], [3, 2]])
np.linalg.norm(starting_point - list_of_points, axis=1)
# array([ 5., 5., 2.])
Вы также можете сделать это трудным путем, возведя в квадрат, суммируя и беря квадратный корень, если вы хотите:
np.sqrt(
np.sum(
np.square(list_of_points - starting_point),
axis = 1)
)
# array([ 5., 5., 2.])