将Numpy数组点转换为Numpy数组距离

时间:2018-05-01 00:56:24

标签: python numpy

如果给我们"starting_point""list_of_points",我们如何创建一个新的numpy数组"距离"包含" starting_point"之间的距离;并且" 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 :(得分:0)

你正在使用Numpy进入正确的轨道。我个人发现Numpy在我第一次使用它时非常不直观,但是通过练习它会变得更容易。

基本思想是你想避免循环并使用矢量化操作。这样可以在大型数据结构上实现更多更快的操作。

部分向量化是broadcasting - 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()docs)计算包括距离在内的不同类型的规范。使用它的技巧是找出使用哪个轴。我更改了值以便于确认正确的答案:

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.])