【问题标题】:Pairwise cdist in scipy instead of zipscipy 中的成对 cdist 而不是 zip
【发布时间】:2014-04-11 02:55:15
【问题描述】:

我想在向量列表和每个向量的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]]])

以及给定像素级值的质心:

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

       [[ 2.  ,  2.5 ,  2.75]],

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

【问题讨论】:

  • 我不认为现在有一种简单的方法可以做到这一点。我正在研究this,它将向scipy.spatial.distance 添加可以做到这一点的功能,但我认为它要等到scipy 0.15(当前版本是0.13,0.14 即将发布)才能准备好。

标签: python numpy matrix scipy linear-algebra


【解决方案1】:

如果我正确理解您的意图,您正在尝试估计每个“组”向量与其他组的质心相距多远。如果是这种情况,您似乎缺少组中向量数量的归一化因子。不过,您可以通过简单地考虑

来很好地估计这个距离
scipy.spatial.distance.pdist(centroids, 'euclidean')

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

由于 cmets 表明您最初寻找的功能并未内置于 scipy 中,因此您必须独立进行每个求和。然而,这个问题是令人尴尬的并行,所以使用multiprocessing 可能会有所帮助。

【讨论】:

  • 我正在尝试将每组向量与其自己的质心的距离相加
  • 刚刚尝试了多处理。我想鉴于大量的小任务,开销不会为您节省任何时间。它慢了 1 秒。
  • @ʞɔıu 当您有小任务时,值得尝试使用 chunksize 参数 - 这有时会产生的不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 2014-03-23
  • 2012-09-02
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多