python中如何计算最小值之和

python中如何计算最小值之和,python,arrays,numpy,Python,Arrays,Numpy,我正在尝试用python构建k-medoids算法。我很难计算成本。我使用的是3集群。例如,我有S(每个点到每个簇的距离矩阵) 以及为每个点指定的标签(使用最小S来指定标签),例如: labels = array([1, 1, 0, 0, 0, 0], dtype=int32) 所以我试着计算成本,即每个点的最小距离之和 def calculate_cost(S): cost = 0 min_cost_idx = np.argmin(S, axis=1) for i i

我正在尝试用python构建k-medoids算法。我很难计算成本。我使用的是3集群。例如,我有S(每个点到每个簇的距离矩阵)

以及为每个点指定的标签(使用最小S来指定标签),例如:

labels = array([1, 1, 0, 0, 0, 0], dtype=int32)
所以我试着计算成本,即每个点的最小距离之和

def calculate_cost(S):
    cost = 0
    min_cost_idx = np.argmin(S, axis=1)
    for i in range(len(min_cost_idx)):
        cost += np.sum(S[i])
    return cost

但它给出的是所有S的总和,而不是每个数据点的最小S的总和。

这是因为
i
为每一行取值,而不是该行中所需的索引。 您应该将
for
循环更改为:

for i,val in enumerate(min_cost_idx):
    cost += np.sum(S[i][val])
话虽如此,您也可以完全摆脱for循环,使用
np.min
函数求和

%timeit (calculate_cost(S))
26.9 µs ± 1.5 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit sum(np.min(S, axis=1))
4.79 µs ± 90.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit (calculate_cost(S))
26.9 µs ± 1.5 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit sum(np.min(S, axis=1))
4.79 µs ± 90.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)