在Scipy而不是Zip中成对CDIST



我想在向量列表的列表和每个向量的centroids列表之间获取cdist

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

那么为什么不这样做呢?因为这是我程序中最慢的部分。我想看看是否有一种在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)])

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

以及鉴于pixelwise的值:

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

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

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

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

评论表明您最初寻找的功能不是内置的Scipy,因此您必须独立进行每个总结。但是,问题是令人尴尬的并行,因此可能有助于使用多处理。

相关内容

  • 没有找到相关文章

最新更新