有没有办法对这段代码进行矢量化以消除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生成伪质心,以防您想要使用它来查找矢量化形式,即在示例中定义了X
和labels
。 p>
感谢您的帮助!
答案 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()