Python 一种快速计算多个时间序列平均值的方法?

Python 一种快速计算多个时间序列平均值的方法?,python,numpy,k-means,Python,Numpy,K Means,我正在用Python和Numpy编写K-Means算法。到所有质心部分的距离都非常优化(使用质心矩阵而不是单独计算每个质心),但我正在努力计算新的质心部分。我从数据集中复制每个质心的数据来计算平均值 我认为不抄袭会更快。如何在Python/Numpy中实现这一点 代码段: for c_i in range(k): sub_data = np.zeros([n_per_c[c_i],data_width]) sub_data_i = 0 f

我正在用Python和Numpy编写K-Means算法。到所有质心部分的距离都非常优化(使用质心矩阵而不是单独计算每个质心),但我正在努力计算新的质心部分。我从数据集中复制每个质心的数据来计算平均值

我认为不抄袭会更快。如何在Python/Numpy中实现这一点

代码段:

    for c_i in range(k):
        sub_data = np.zeros([n_per_c[c_i],data_width])

        sub_data_i = 0
        for data_i in range(data_length):
            if label[data_i] == c_i:                    
                sub_data[sub_data_i,:] = data[data_i,:]
                sub_data_i += 1

        c[c_i] = np.mean(sub_data, axis=0)

c是我拥有的质心列表,data是整个数据集,label是带有classlabels的列表。

我认为以下内容与代码相同,没有任何明确的中间数组:

for c_i in range(k):
    c[c_i] = np.mean(data[label == c_i, :], axis=0)
摆脱最后一个循环比较困难,但这应该是可行的:

label_counts = np.bincount(label)
label_sums = np.histogram2d(np.repeat(label, data_length),
                            np.tile(np.arange(data_length), k),
                            bins=(k, data_length),
                            weights=data.ravel())[0]
c = label_sums / label_count[:, None]

谢谢杰米!第一种解决方案已经将代码的速度从1分钟提高到不到一秒。你能解释一下第二种解决方案的作用吗?我真的不知道该怎么做。
label\u counts
是指每个标签出现的次数。我知道需要每个标签和列的值之和
data.ravel()<代码>np.重复(标签,数据长度)
索引每个单独数据项的标签。类似地,
np.tile(np.arange(数据长度),k)
索引列号。调用
np.histogram2d
并使用该大小的bins,只需将具有相同标签和列的所有值相加,并以正确的形状返回。最后,将这些总和除以计数,将计数广播到整行。