gpt4 book ai didi

python - 在没有numpy的情况下计算python中一组坐标元组的质心的最快方法

转载 作者:IT老高 更新时间:2023-10-28 20:22:47 27 4
gpt4 key购买 nike

我一直在从事一个对时间非常敏感的项目(不幸的是它必须在 python 中),并且广泛使用的函数之一是计算 (x, y) 列表的质心的函数元组。举例说明:

def centroid(*points):
x_coords = [p[0] for p in points]
y_coords = [p[1] for p in points]
_len = len(points)
centroid_x = sum(x_coords)/_len
centroid_y = sum(y_coords)/_len
return [centroid_x, centroid_y]

在哪里

>>> centroid((0, 0), (10, 0), (10, 10), (0, 10))
[5, 5]

这个函数运行得相当快,上面的例子在我的系统上平均在 1.49e-05 秒内完成,但我正在寻找计算质心的最快方法。你有什么想法吗?

我的其他解决方案之一是执行以下操作(其中 l 是元组列表):

map(len(l).__rtruediv__, map(sum, zip(*l)))

在 1.01e-05 和 9.6e-06 秒之间运行,但不幸的是转换为一个列表(通过将整个语句包围在 list( ... ) 中)几乎是双倍的 计算时间。

编辑:在纯 python 中欢迎建议,但不是 numpy。

EDIT2:刚刚发现如果为元组列表的长度保留一个单独的变量,那么我上面的 map 实现在 9.2e-06 秒内可靠地运行,但仍然存在转换回列表的问题。

EDIT3:

现在我只接受纯 python 中的答案,而不是 numpy(对不起那些已经用 numpy 回答的人!)

最佳答案

import numpy as np

data = np.random.randint(0, 10, size=(100000, 2))

这里很快

def centeroidnp(arr):
length = arr.shape[0]
sum_x = np.sum(arr[:, 0])
sum_y = np.sum(arr[:, 1])
return sum_x/length, sum_y/length

%timeit centeroidnp(data)
10000 loops, best of 3: 181 µs per loop

令人惊讶的是,这要慢得多:

%timeit data.mean(axis=0)
1000 loops, best of 3: 1.75 ms per loop

numpy 对我来说似乎很快......

为了完整性:

def centeroidpython(data):
x, y = zip(*data)
l = len(x)
return sum(x) / l, sum(y) / l
#take the data conversion out to be fair!
data = list(tuple(i) for i in data)

%timeit centeroidpython(data)
10 loops, best of 3: 57 ms per loop

关于python - 在没有numpy的情况下计算python中一组坐标元组的质心的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23020659/

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