成对的cdist在scipy而不是zip

时间:2014-03-07 19:22:59

标签: python numpy matrix scipy linear-algebra

我希望在一个向量列表列表和每个向量的cdist列表之间得到centroids

换句话说,我想做相当于[cdist(px, cent) ** 2 for px, cent in izip(pixelwise, centroids)]

那么为什么不这样做呢?因为它是我程序中最慢的部分。我想知道是否有一种在numpy / scipy中本地执行的方法,这比我在python中使用列表表达式+ zip的方式更快。<​​/ p>

示例代码:

pixelwise = allframes.transpose((1, 0, 2))
centroids = pixelwise.mean((0,)).reshape((pixelwise.shape[0], 1, 3))
variances += weight * numpy.sum(
   [cdist(px, cent, 'euclidean') ** 2 for px, cent in izip(pixelwise, centroids)])

pixelwise的示例值:

array([[[1, 1, 2],
        [2, 3, 4],
        [2, 2, 2]],

       [[1, 2, 3],
        [2, 3, 4],
        [2, 2, 2]],

       [[1, 2, 3],
        [2, 1, 1],
        [2, 2, 2]],

       [[4, 3, 2],
        [2, 3, 2],
        [2, 2, 2]]])

以及像素值得到的质心得到的结果:

array([[[ 1.75,  2.  ,  2.5 ]],

       [[ 2.  ,  2.5 ,  2.75]],

       [[ 2.  ,  2.  ,  2.  ]]])

1 个答案:

答案 0 :(得分:0)

如果我理解你的意图正确,你试图估计每个“组”矢量与其他组的质心之间的距离。如果是这种情况,看起来您错过了组中矢量数量的归一化因子。不过,您可以通过简单地考虑

来获得该距离的良好估计值
scipy.spatial.distance.pdist(centroids, 'euclidean')

即。从质心到彼此的距离。这是一阶近似。如果你将这个数据用于算法,它可能足够好,因为它可以找到分离最多的向量集。

由于注释表明您最初寻找的功能并未构建为scipy,因此您必须独立完成每个求和。但是,问题是令人尴尬的并行,因此使用multiprocessing可能会有所帮助。