Python 以scipy而不是zip显示成对cdist

Python 以scipy而不是zip显示成对cdist,python,numpy,matrix,scipy,linear-algebra,Python,Numpy,Matrix,Scipy,Linear Algebra,我想得到向量列表和每个向量的质心列表之间的cdist 换句话说,我想做与izip(像素方向,质心)中的cdist(px,cent)**2对应的[cdist(px,cent)**2 那么,为什么不这样做呢?因为这是我节目中最慢的部分。我想看看是否有一种在numpy/scipy中本机实现的方法比我在python中使用列表表达式+zip实现的方法更快 示例代码: pixelwise = allframes.transpose((1, 0, 2)) centroids = pixelwise.mean(

我想得到向量列表和每个向量的
质心列表之间的
cdist

换句话说,我想做与izip(像素方向,质心)中的cdist(px,cent)**2对应的
[cdist(px,cent)**2

那么,为什么不这样做呢?因为这是我节目中最慢的部分。我想看看是否有一种在numpy/scipy中本机实现的方法比我在python中使用列表表达式+zip实现的方法更快

示例代码:

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)])
像素值示例:

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.  ]]])
在给定像素值的情况下,质心的结果是:

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.  ]]])

如果我正确理解了你的意图,你是在试图估计向量的每个“组”与其他组的质心之间的距离。如果是这种情况,则组中的向量数似乎缺少一个标准化因子。尽管如此,您可以通过简单地考虑

scipy.spatial.distance.pdist(centroids, 'euclidean')
i、 e.质心之间的距离。这是一阶近似。如果您将这些数据用于一个算法,它可能已经足够好了,因为它可以找到最分离的向量集


由于注释表明您最初寻找的功能没有内置到scipy中,因此您必须独立地进行每个求和。然而,这个问题是令人尴尬的平行,因此它可能有助于使用

我认为现在没有一个简单的方法可以做到这一点。我正在做的是在scipy.spatial.distance中添加一些功能,可以做到这一点,但我认为它要到scipy 0.15(当前版本是0.13,即将发布0.14)才能准备好。我正在尝试计算每组向量离其自身中心的距离,只是尝试了多处理。我想,考虑到大量的小任务,开销并不能为您节省任何时间;它慢1秒。@ʞɔıu当您有小任务时,值得尝试
chunksize
参数-这有时会产生很大的差异。