我试图使用Haversine公式计算一长串由纬度和经度标识的位置的距离矩阵,该公式采用两个坐标对元组来产生距离:
def haversine(point1, point2, miles=False):
""" Calculate the great-circle distance bewteen two points on the Earth surface.
:input: two 2-tuples, containing the latitude and longitude of each point
in decimal degrees.
Example: haversine((45.7597, 4.8422), (48.8567, 2.3508))
:output: Returns the distance bewteen the two points.
The default unit is kilometers. Miles can be returned
if the ``miles`` parameter is set to True.
"""
我可以使用嵌套的for循环计算所有点之间的距离,如下所示:
data.head()
id coordinates
0 1 (16.3457688674, 6.30354512503)
1 2 (12.494749307, 28.6263955635)
2 3 (27.794615136, 60.0324947881)
3 4 (44.4269923769, 110.114216113)
4 5 (-69.8540884125, 87.9468778773)
使用一个简单的函数:
distance = {}
def haver_loop(df):
for i, point1 in df.iterrows():
distance[i] = []
for j, point2 in df.iterrows():
distance[i].append(haversine(point1.coordinates, point2.coordinates))
return pd.DataFrame.from_dict(distance, orient='index')
但考虑到时间复杂度,这需要相当长的时间,对于500个点,运行时间约为20秒,我有一个更长的列表。这让我开始研究矢量化,我遇到过numpy.vectorize
((docs)),但不知道如何在这种情况下应用它。
4条答案
按热度按时间xghobddn1#
从
haversine's function definition
来看,它看起来非常 * 可并行化 *。因此,使用NumPy(又名broadcasting
)进行矢量化的最佳工具之一,并将数学函数替换为NumPy等效值ufuncs
,这是一个矢量化解决方案-测试-
另一个
np.vectorize based solution
在性能上比原始代码有了一些积极的改进,因此本节将比较基于发布广播的方法和基于发布广播的方法。功能定义-
时间-
wpx232ag2#
您可以将函数作为参数提供给
np.vectorize()
,然后可以将其用作pandas.groupby.apply
的参数,如下所示:例如,样本数据如下:
比较500点:
xtupzzrd3#
首先使用
itertools.product
获取所有组合说我不确定它会有多快,这看起来像是Python: speeding up geographic comparison的复制品
but5z9lq4#
查看haversine python library,它提供了一个方便的
haversine_vector
函数,用于计算矢量化输入的距离。此功能对于地理坐标列表之间的快速距离计算特别有用。下面是一个来自图书馆文档的实际例子:
如果你正在使用一个包含坐标信息的pandas框架,并且需要计算多个数据点的距离,你可以通过将坐标转换为列表并使用
haversine_vector
来轻松实现这一点,如下面的示例所示:此代码片段有效地计算了您的坐标框中相应坐标对之间的距离,并将结果存储在新的“distance”列中。
有关详细信息和安装说明,您可以访问haversine library's page on PyPI。