Превратить массив точек Numpy в массив расстояний - PullRequest
0 голосов
/ 01 мая 2018

Если нам даны "starting_point" и "list_of_points", как мы можем создать новый массив значений «Расстояния», который содержит расстояние между «начальной_точкой» и каждой точкой в ​​«list_of_points»?

Я пытался сделать это, просматривая "list_of_points" со следующим кодом, но это не сработало:

distances = sqrt( (list_of_points[num][0] - starting_point[0])^2 + list_of_points[num][1] - starting_point[1])^2 ) for num in range (0,4)

starting_point = np.array([1.0, 2.0])

list_of_points = np.array([-5.0, -3.0], [-4.0, 2.0], [7.0, 8.0], [6.0, -9.0])  

distances = np.array([ d1 ], [ d2 ], [ d3 ], [ d4 ]) 

1 Ответ

0 голосов
/ 01 мая 2018

Вы на правильном пути, используя для этого 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.])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...