消除 for 循环挑战和启发式的存在,以消除一般的 for 循环

问题描述 投票:0回答:1

我不知道我是否太过分了,但我想删除下面代码中的 for 循环:

# self.assigments = (N, )
# self.points = (N, 2)
# centers = (3, 2)
centers = np.zeros((self.K, self.points.shape[1]))
_, counts = np.unique(self.assignments, return_counts=True)
for point, assignment in zip(self.points, self.assignments):
    centers[assignment][0] += point[0] / counts[assignment]
    centers[assignment][1] += point[1] / counts[assignment]
return centers

此代码基本上根据分配重新计算 K-Means 聚类算法的中心。我正在努力删除 for 循环,但我的直觉表明它可以删除。这让我想知道,在尝试通过矢量化等技术删除

for
循环时,是否可以考虑任何规则/启发法?

我的期望是,从上述代码中删除

for
循环是可能的,并且通常可以通过删除
for
循环来应用一些规则或启发式进行优化。

python numpy vectorization
1个回答
0
投票

counts[self.assignments]
会产生什么?一个 (N,) 数组?

self.points   # (N,2)
temp = self.points/counts[self.assignments][:,None] 

应该是 (N,2)。所以我的猜测是

for assignment in self.assignments:
    centers[assignment] += temp[assignment]

这并不能消除大的

N
循环,但可能会使
+=
分配的可视化变得更容易。

在我内心深处,我想

bincount
在这里可能有用。不过这个功能我没怎么用过。

我想这说明了我的双重方法 - 尽可能地清理内部“矢量化”,然后对主迭代进行可视化。

© www.soinside.com 2019 - 2024. All rights reserved.