gpt4 book ai didi

python - 使用 Python 代码并行化计算两点之间距离的最快方法

转载 作者:行者123 更新时间:2023-11-28 22:36:00 25 4
gpt4 key购买 nike

我有一个包含数百万行的数据框“数据”。每行都有坐标('x','y'),我想以 python 可以提供的最有效方式计算连续坐标对之间的距离。并行化在这里有帮助吗?

我在这里看到建议使用 cython 的方法。但是我只想看到 python 解决方案。

这是我的数据片段

points = 
[(26406, -6869),
(27679, -221),
(27679, -221),
(26416, -6156),
(26679, -578),
(26679, -580),
(27813, -558),
(26254, -1097),
(26679, -580),
(27813, -558),
(28258, -893),
(26253, -1098),
(26678, -581),
(27811, -558),
(28259, -893),
(26252, -1098),
(27230, -481),
(26679, -582),
(27488, -5849),
(27811, -558),
(28259, -893),
(26250, -1099),
(27228, -481),
(26679, -582),
(27488, -5847),
(28525, -1465),
(27811, -558),
(28259, -892)]

我相信我的第一个使用 for-loop 的方法肯定可以改进:

    from scipy.spatial import distance
def comp_dist(points):
size =len(points)
d = 0
i=1
for i in range(1,size):
if i%1000000==0:
print i
# print "i-1:", points[i-1]
# print "i: ", points[i]
dist = distance.euclidean(points[i-1],points[i])
d= d+dist
print d

distance = comp_dist(points)

提前感谢您的回答。

最佳答案

你说的是 python,但由于你已经在使用 scipy 进行距离计算,所以我认为 numpy 解决方案就可以了。

在 2800 万点的 numpy 数组上使用矢量化单线程操作在我的笔记本电脑上只需要 1 秒。该数组使用32位整数数据类型,占用内存约200MB。

import numpy as np
points = [(26406, -6869), ..., (28259, -892)]
# make test array my repeating the 28-element points list 1M times
np_points = np.array(points*1000000, dtype='int32')
# use two different slices (offset by 1) from resulting array;
# execution of next line takes ~1 second
dists = np.sqrt(np.sum((np_points[0:-2] - np_points[1:-1])**2, axis=1))
print(dists.shape)
(27999998,)

print(dists[:28])
[ 6.76878372e+03 0.00000000e+00 6.06789865e+03 5.58419672e+03
2.00000000e+00 1.13421338e+03 1.64954600e+03 6.69263775e+02
1.13421338e+03 5.57000898e+02 2.01545280e+03 6.69263775e+02
1.13323343e+03 5.59400572e+02 2.01744244e+03 1.15636197e+03
5.60180328e+02 5.32876815e+03 5.30084993e+03 5.59400572e+02
2.01953386e+03 1.15689585e+03 5.58213221e+02 5.32679134e+03
4.50303153e+03 1.15431581e+03 5.58802291e+02 6.25764636e+03]

关于python - 使用 Python 代码并行化计算两点之间距离的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37790062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com