我希望在一个向量列表列表和每个向量的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. ]]])
答案 0 :(得分:0)
如果我理解你的意图正确,你试图估计每个“组”矢量与其他组的质心之间的距离。如果是这种情况,看起来您错过了组中矢量数量的归一化因子。不过,您可以通过简单地考虑
来获得该距离的良好估计值scipy.spatial.distance.pdist(centroids, 'euclidean')
即。从质心到彼此的距离。这是一阶近似。如果你将这个数据用于算法,它可能足够好,因为它可以找到分离最多的向量集。
由于注释表明您最初寻找的功能并未构建为scipy,因此您必须独立完成每个求和。但是,问题是令人尴尬的并行,因此使用multiprocessing可能会有所帮助。