【问题标题】:How to get center of set of points using Python如何使用 Python 获取点集的中心
【发布时间】:2011-05-20 08:17:47
【问题描述】:

我想获取由一组点创建的图形的中心点(x,y)。

我该怎么做?

【问题讨论】:

  • 定义“中心”。重心?质心?还有什么?
  • 这更像是一道数学题。我认为在这本优秀的书中:openbookproject.net/thinkcs 我不记得是在 python 还是 C++ 中,有一些你想要实现的例子。

标签: python matplotlib triangulation


【解决方案1】:

如果你指的是质心,你只是得到所有点的平均值。

x = [p[0] for p in points]
y = [p[1] for p in points]
centroid = (sum(x) / len(points), sum(y) / len(points))

【讨论】:

  • 但是要小心 Python 2.x 中的整数除法:如果每个点都有一个整数 x 值,那么质心的 x 值将向下舍入为整数。使用from __future__ import division,在除法前显式转换为浮点数,或者使用Python 3。
  • 如果points 是一个二维Numpy 数组,你可能只需要使用points.mean(0)
  • 那不是质心,只是点的平均值。如果要计算质心,则必须对离散段使用格林定理,如en.wikipedia.org/wiki/Centroid#Centroid_of_polygon
【解决方案2】:

如果点集是大小为 N x 2 的 numpy 数组 positions,则质心简单地由下式给出:

centroid = positions.mean(axis=0)

它会直接给你一个 numpy 数组的 2 个坐标。

一般来说,numpy 数组可以以矢量化方式用于所有这些度量,与for 循环相比,这种方式紧凑且非常快。

【讨论】:

    【解决方案3】:

    我假设一个点是一个像 (x,y) 这样的元组,所以你可以使用 zip 来连接 x 和 y。然后使用 x 和 y 的最小值和最大值,就可以确定中心点。

    x,y=zip(*points)
    center=(max(x)+min(x))/2., (max(y)+min(y))/2.
    

    样本输出

    Points in an array : [(411, 148), (304, 148), (357, 241)]
    x:(411, 304, 357)
    y:(148, 148, 241)
    center: (357.5, 194.5)
    

    【讨论】:

    • 不应该是max + min,而不是max - min吗?
    • 试图了解这是在做什么......为什么我们要“添加”最小值到最大值? @colin 的回答对我来说很有意义,但不确定为什么这也有效。
    • 您使用的是 min max 而不是减法和加法。例如,如果 min 为 10,max 为 40 - min 为 10,max 为 40,则 50/2=25。您可以使用 10 + ((40-10)/2) 得出相同的答案 - 两者都工作得很好。
    • 另外注意:这个中心和另一个答案不是同一个中心 - 对于多边形有多个“中心”公式en.wikipedia.org/wiki/Centroid
    猜你喜欢
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 2016-10-27
    • 2016-12-25
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    相关资源
    最近更新 更多