我想在向量列表的列表和每个向量的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,因此您必须独立进行每个总结。但是,问题是令人尴尬的并行,因此可能有助于使用多处理。