繁体   English   中英

点到点列表之间的距离

[英]Distance between point to list of points

我正在尝试计算从点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 s。 但在这种情况下,我不知道如何解决这个问题。

即使您已经将点分成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

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

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

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

dist=math.sqrt((p0 - s0)**2 + (p1 - s1)**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]

也许尝试改变这一行:

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

到:

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

如果你想要欧几里得距离,你可以做这样的事情(即使没有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

如果您不受可以使用的软件包的限制。 使用 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.])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM