【问题标题】:Iterating over pairs of coordinates in Python [duplicate]在Python中迭代坐标对[重复]
【发布时间】:2016-05-11 01:58:32
【问题描述】:

我有一个坐标列表:

[(52.472665, -1.8977818),
(52.47455886, -1.90080653),
(52.4515712, -1.9327772),
(52.45028622, -1.93212766),..]

我正在尝试编写代码,让我可以使用 Haversine 模块计算每个人之间的距离:

(伪代码)

for points in daycoords1:

p1 = day1coords[0]

p2 = day1coords[1]

dist_miles = haversine(p1, p2, miles=True)

distday1.append(dist_miles)

有没有办法拉入坐标一和二,测量距离,二和三并测量距离等。

我一直在尝试使用 itertools 和 zip() 但我还没有运气。

【问题讨论】:

  • 我认为您将不得不使用for i in range(...) 而不是for x in list

标签: python loops coordinates itertools haversine


【解决方案1】:

我不确定确切您想从 haversine 模块中使用什么功能,但是要比较坐标列表中的两个连续项目,您可以使用带有 @987654322 的列表推导@你的坐标切片:

coords = [(52.472665, -1.8977818),
(52.47455886, -1.90080653),
(52.4515712, -1.9327772),
(52.45028622, -1.93212766)]

distances = [haversine(p1, p2, miles=True) for p1, p2 in zip(coords[:-1], coords[1:])]

这会将p1p2p2p3p3p4 等进行比较......

【讨论】:

  • 不需要压缩,你可以这样做:for x,y in coords: etc
  • 但是您将无法将x1, y1x2, y2 进行比较
  • 哦,我的错,我以为他只是想解开坐标本身而不是两个。
  • 当使用这个时,距离的输出仍然只给出前两点之间的距离?
  • 仔细检查您的输入。代码正确
【解决方案2】:

如果我理解正确,您需要做的就是遍历
zip(daycoords1, daycoords1[1:]) 并进行计算。演示:

>>> daycoords1 = [(1,2), (3,4), (5,6)]
>>> for x in zip(daycoords1, daycoords1[1:]):
...     print(x)
... 
((1, 2), (3, 4))
((3, 4), (5, 6))

如果您有很多坐标,请考虑使用itertools.izip 以提高内存效率。

【讨论】:

  • 我喜欢你不需要分割第一个 daycoords1 zip 参数的事实。整洁
  • @gtlambert yes zip 将在最短的迭代用完时停止。要通过最长的可迭代,有itertools.izip_longest
【解决方案3】:

如果你想计算两个位置之间的距离,你可以试试下面的range(一个接一个如d所示,向前看)。

from haversine import haversine

d = [(52.472665, -1.8977818),
(52.47455886, -1.90080653),
(52.4515712, -1.9327772),
(52.45028622, -1.93212766),(53.45028622, -1.93212766)]

data = []

for i in range(len(d)-1):
    data.append(haversine(d[i], d[i+1], miles=True))

print data

输出-

[0.18255943050822185, 2.0818287457607068, 0.09290096620460978, 69.0933027640562]

编辑- 如果您想获取d 中所有组合(所有可能的非重复位置对)之间的距离,那么 -

from haversine import haversine
from itertools import combinations

d = [(52.472665, -1.8977818),
(52.47455886, -1.90080653),
(52.4515712, -1.9327772),
(52.45028622, -1.93212766),(52.45028622, -1.93212766)]

data = []

for pair in combinations(d,2):
    data.append(haversine(pair[0], pair[1], miles=True))

print data

输出-

[0.18255943050822185, 2.072320708393457, 2.1169388238266245, 2.1169388238266245, 2.0818287457607068, 2.1333352954019116, 2.1333352954019116, 0.09290096620460978, 0.09290096620460978, 0.0]

【讨论】:

  • 如果坐标是奇数,这不会失败吗?此外,这只允许将 p1 与 p2、p3 与 p4 等进行比较...
  • 而不是所有组合我试图让它得到p1和p2之间的距离,然后是p2和p3,然后是p3和p4,等等。
  • OK 查看修改后的答案..
猜你喜欢
  • 1970-01-01
  • 2012-07-23
  • 2014-05-19
  • 2019-02-23
  • 2018-09-20
  • 2020-05-18
  • 2017-08-19
  • 2015-01-01
  • 2021-05-31
相关资源
最近更新 更多