Python中求多个多边形点数组平均值的最优方法?
求多个多边形对应顶点平均值的最优方法
嘿,我来帮你优化这个求多边形对应顶点平均值的问题~你现在的代码虽然能实现功能,但扩展性太差了——要是以后多边形的顶点数变了,或者新增更多多边形,就得手动创建一堆x5、y5这类列表,代码会变得冗长又难维护。下面给你几个更优的实现方案:
纯Python简洁实现(推荐小规模场景)
利用Python内置的zip(*polys)可以自动把所有多边形的对应位置顶点打包在一起,比如第一个包就是所有多边形的第一个顶点,第二个包是所有多边形的第二个顶点,以此类推。然后对每个顶点包计算x、y坐标的平均值即可:
poly1 = [(2, 2), (10, 0), (10, 10), (2, 10)] poly2 = [(4, 4), (20, 0), (20, 20), (4, 20)] polys = [poly1, poly2] averaged_vertices = [] # 打包所有多边形的对应顶点 for vertices_group in zip(*polys): # 计算当前顶点组的x坐标平均值 avg_x = sum(v[0] for v in vertices_group) / len(vertices_group) # 计算当前顶点组的y坐标平均值 avg_y = sum(v[1] for v in vertices_group) / len(vertices_group) averaged_vertices.append((avg_x, avg_y)) print(averaged_vertices) # 输出结果: [(3.0, 3.0), (15.0, 0.0), (15.0, 15.0), (3.0, 15.0)]
如果想更精简,还可以用列表推导式一行搞定:
averaged_vertices = [ (sum(v[0] for v in group)/len(group), sum(v[1] for v in group)/len(group)) for group in zip(*polys) ]
这个方案的优势:
- 完全不需要手动维护
x1、y1这类列表,逻辑清晰 - 扩展性拉满:不管你有10个还是100个多边形,只要所有多边形的顶点数一致,代码都不用改
大规模数据高效实现(用numpy)
如果你的多边形数量特别多,或者顶点数很大,纯Python循环的效率会有点低,这时候用numpy的向量化运算会快很多:
import numpy as np poly1 = [(2, 2), (10, 0), (10, 10), (2, 10)] poly2 = [(4, 4), (20, 0), (20, 20), (4, 20)] polys = [poly1, poly2] # 把多边形列表转成numpy数组 polys_array = np.array(polys) # 沿着多边形的维度(axis=0)求平均值 averaged_vertices = np.mean(polys_array, axis=0).tolist() print(averaged_vertices) # 输出结果: [[3.0, 3.0], [15.0, 0.0], [15.0, 15.0], [3.0, 15.0]]
numpy会自动帮你完成所有对应位置的数值计算,代码更简洁,运算速度也比纯Python快几个量级。
内容的提问来源于stack exchange,提问作者user4352250
相关产品推荐
相关产品推荐

