使用numpy数组函数更新元素

时间:2016-04-24 20:26:42

标签: python algorithm numpy

我正在尝试为小项目实现k-mean聚类算法。我遇到了this article,这表明

  

如果使用numpy数组上的操作编写更新函数,而不是手动循环遍历数组并自行更新值,K-Means会快得多。

我正在使用迭代遍历数组的每个元素来更新它。对于数据集z中的每个元素,我通过迭代通过每个元素从最近的质心分配集群数组。

    for i in range(z):
        clstr[i] = closest_center(data[i], cen)

我的更新功能是

def closest_center(x, clist):
    dlist = [fabs(x - i) for i in clist]
    return clist[dlist.index(min(dlist))]

由于我使用的是灰度图像,因此我使用绝对值来计算欧几里德距离。

我注意到opencv也有这个算法。执行算法需要不到2秒,而我的执行时间超过70秒。我可以知道这篇文章的内容吗?

我的图像以灰度导入,并表示为2d numpy数组。我进一步转换为1d数组,因为它更容易处理1d数组。

1 个答案:

答案 0 :(得分:1)

列表理解可能会减慢执行速度。我建议 vectorize 函数closest_center。这对于一维数组来说非常简单:

import numpy as np

def closest_center(x, clist):
    return clist[np.argmin(np.abs(x - clist))]