从numpy压缩距离矩阵获取整行距离

时间:2015-01-18 12:21:42

标签: python numpy

我有一个由一组数据点x:

生成的numpy压缩距离矩阵
dists = scipy.spatial.distance.pdist(x)

对于数据点i和j之间的距离(假设i

condensed_inx = lambda i,j,n: i*n + j - i*(i+1)/2 - i - 1  # n is the number of data points

然后,我可以通过以下方式获得点i和j之间的距离:

dists[condensed_inx(i, j, n)]

对于单一距离,这是微不足道的。但是,我无法找到一种快速/有效的方法来获取涉及数据点i的所有距离的所有距离。这就是我目前所拥有的:

n = n = scipy.spatial.distance.num_obs_y(dists) #Get number of data points from condensed matrix
for i in range(n):
    #Get all distance indices relative to data point i
    inx = []
    for j in range(n):
        if i < j:
            inx.append(condensed_inx(i, j, n))
        elif i > j:
            inx.append(condensed_inx(j, i, n))
        else:
            continue
    #Get distances relative to data point i
    distance_for_i = dists[np.array(inx, dtype=np.uint64)]

    #Do some calculations with the distances_for_i
    #For example
    print np.mean(distance_for_i)

更新:看起来效率低下来自“condensed_inx”lambda函数。

1 个答案:

答案 0 :(得分:2)

除非你正在处理非常大的数组,否则你可能最好使用squareform构建方形距离矩阵,然后对每一行进行处理。例如,您的平均示例变为

dists = scipy.spatial.distance.pdist(x)
square = scipy.spatial.distance.squareform(dists)
print square.mean(axis=1)