此函数在Python中的最短表示形式

此函数在Python中的最短表示形式,python,math,Python,Math,目前我有: def func(points): #Input is a matrix with n lines and 2 columns. centroid = numpy.mean(points, axis=0) sum = 0 for point in points: x = point[0] - centroid[0] y = point[1] - centorid[1] sum += x**2 + y**2

目前我有:

def func(points): #Input is a matrix with n lines and 2 columns.
    centroid = numpy.mean(points, axis=0)
    sum = 0
    for point in points:
        x = point[0] - centroid[0]
        y = point[1] - centorid[1]
        sum += x**2 + y**2
    return math.sqrt(sum)

有一个用于序列求和的内置函数,叫做
sum
(很奇怪)。我们可以使用生成器创建数据,并将其直接提供给
sum
函数。因此:

return math.sqrt(sum((p[0]-centroid[0])**2 + (p[1]-centroid[1])**2 for p in points))

由于您使用的是NumPy,因此可以使用:

我相信,尽管我不确定,使用numpy[:,n]语法进行索引比列表理解更快。类似地,使用
np.sum
应该比使用Python的
sum
更快


注:
hypot
计算平方根,从而将平方根移到总和内。这反映了您问题中的等式,尽管您的代码做了一些不同的事情。

回复删除的注释:强烈反对将公式放在多行上使其更具可读性,特别是像这样一个相当简单和常见的公式(添加正交)。理解是Python的基础,在简单的情况下自己创建一个列表是很难看的,而且与“应该只有一种方法”相矛盾。你打算怎么称呼这些子表达式呢<代码>求和屏蔽了一个内置项,而且根本不是描述性的。同意。坦白地说,当一个公式被分成几个步骤时,它的意义就小得多,而且很难识别它到底是什么。很好,这是我唯一可以做的稍微不同的事情。mx,my=numpy.平均值(点,轴=0);返回math.sqrt(sum((x-mx)**2+(y-my)**2表示x,y表示点))@mrtw我遵循代码,而不是公式图像+一是指出来;;我相信OP能找到解决方法。你的代码累加
x**2+y**2
,然后取平方根。但是您的公式累加了
x**2+y**2
的平方根。您在第6行有一个输入错误:错误的centorid,而不是质心。
def func(points):
    centroid = np.mean(points, axis=0)
    return np.sum(np.hypot(points[:,0]-centroid[0], points[:,1]-centroid[1]))