有没有办法矢量化这个循环

时间:2014-12-16 08:12:09

标签: python numpy scikit-learn vectorization

有没有办法对这段代码进行矢量化以消除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。 p>

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

您可以使用bincount()三次:

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

但是如果你能使用熊猫,这很简单:

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