点到点列表之间的距离

时间:2019-06-25 03:30:05

标签: python

我正在尝试计算从点p到列表s中每个点的距离。

import math
s= [(1,4),(4,2),(6,3)]
p= (3,7)

p0,p1=p
dist=[]

for s0,s1 in s:
    dist=math.sqrt((p0[0] - p1[0])**2 + (s0[1] - s1[1])**2)
    dist= dist+1
    print(dist)

TypeError                                 Traceback (most recent call last)
<ipython-input-7-77e000c3374a> in <module>
      3 dist=[]
      4 for s0,s1 in s:
----> 5    dist=math.sqrt((p0[0] - p1[0])**2 + (s0[1] - s1[1])**2)
      6 
      7 

TypeError: 'int' object is not subscriptable

我看到由于p0,p1int个,访问位置已停止。但是在这种情况下,我不知道如何解决这个问题。

6 个答案:

答案 0 :(得分:3)

即使您已经将点分隔成x, y,您还是不小心在数据上使用了索引。此外,您正在覆盖列表,而不保存数据。而且距离公式不正确,应该是点之间的减法而不是加法。试试这个:

import math
s= [(1,4),(4,2),(6,3)]
p= (3,7)

p0,p1=p
dist=[]

for s0,s1 in s:
    dist_=math.sqrt((p0 - s0)**2 + (p1 - s1)**2) #Edit this line to [0]s and [1]s
    dist_= dist_+1 #Also change name and/or delete
#    print(dist)
    dist.append(dist_) #Save data to list

答案 1 :(得分:2)

dist=math.sqrt((p0[0] - p1[0])**2 + (s0[1] - s1[1])**2)

在这里,您正在索引整数。

此外,您在计算中犯了错误。应该是:

dist=math.sqrt((p0 - s0)**2 + (p1 - s1)**2)

答案 2 :(得分:2)

如果需要的是距离列表,则可以在一行代码中使用列表理解来完成:

import math
import pprint

s = [(1,2),(3,4),(-1,1),(6,-7),(0, 6),(-5,-8),(-1,-1),(6,0),(1,-1)]
p = (3,-4)

dists = [math.sqrt((p[0]-s0)**2 + (p[1]-s1)**2) for s0, s1 in s]

pprint.pprint(dists)

这里的另一件事是我从OPs代码中删除了dist = dist + 1。我不认为这是正确的...为什么要在每个计算出的距离上加1?

结果:

[6.324555320336759,
 8.0,
 6.4031242374328485,
 4.242640687119285,
 10.44030650891055,
 8.94427190999916,
 5.0,
 5.0,
 3.605551275463989]

答案 3 :(得分:1)

也许尝试更改此行:

    dist=math.sqrt((p0[0] - p1[0])**2 + (s0[1] - s1[1])**2)

收件人:

    dist=math.sqrt((p0 - p1)**2 + (s0 - s1)**2)

答案 4 :(得分:0)

如果您想要欧几里德距离,则可以执行以下操作(即使没有import math

s = [(1, 4), (4, 2), (6, 3)]
p = (3, 7)

for point in s:
    sum_ = sum((p[i] - point[i]) ** 2 for i in range(len(p)))
    distance = sum_ ** (1 / 2)  # take the square root, the same thing as math.sqrt()
    print(p, point, round(distance, 1))

结果:

(3, 7) (1, 4) 3.6
(3, 7) (4, 2) 5.1
(3, 7) (6, 3) 5.0

您在代码中遇到的错误是因为您在整数上使用了索引。就像这样:

>>> a = 3
>>> a[0]
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    a[0]
TypeError: 'int' object is not subscriptable

答案 5 :(得分:0)

如果您不受可以使用的软件包的限制。使用 NumPy 的实现会更快。

import numpy as np

s = np.array([(1,4),(4,2),(6,3)])
p = np.array((3,7))

dist = np.linalg.norm(p - s, axis=1)

结果:

array([3.60555128, 5.09901951, 5.])