【问题标题】:Is there a way to vectorize this loop有没有办法矢量化这个循环
【发布时间】:2025-11-23 03:45:01
【问题描述】:

有没有办法将这段代码向量化以消除for循环:

import numpy as np
Z = np.concatenate((X, labels[:,None]), axis=1)
centroids = np.empty([len(unique(labels))-1,2])
for i in unique(labels[labels>-1]):
    centroids[i,:]=Z[Z[:,-1]==i][:,:-1].mean(0)
centroids

此代码从DBSCAN scikit-learn example 生成伪质心,以防您想使用它来查找矢量化形式,即示例中定义了Xlabels

感谢您的帮助!

【问题讨论】:

    标签: python numpy scikit-learn vectorization


    【解决方案1】:

    你可以使用bincount() 3次:

    count = np.bincount(labels)
    x = np.bincount(labels, X[:, 0])
    y = np.bincount(labels, X[:, 1])
    
    centroids = np.c_[x, y] / count[:, None]
    print centroids
    

    但是如果你可以使用pandas,这很简单:

    Z = np.concatenate((X, labels[:,None]), axis=1)
    df = pd.DataFrame(Z, columns=("x", "y", "label"))
    df[df['label']>-1].groupby("label").mean()
    

    【讨论】:

    • 很好的回答 HYRY,感谢您的帮助!第一个 numpy 版本不太有效,因为异常值的标签中有一个负值,这就是我有“标签 [标签>-1]”的原因。 pandas 版本效果很好,我可以通过上面包含的小修改来消除负索引。如果您在 numpy 解决方案中有解决此问题的方法,我会很高兴看到它。再次感谢!