在 运行 scipy.spatial.distance.pdist 之后提取距离

Extract distances after running scipy.spatial.distance.pdist

我有一个 Pandas 数据框(见下面的小例子)。我想根据 3 列(特征)中的值计算观察值(行)之间的欧几里得距离。我正在使用 scipy.spatial.distance.pdist.

我知道返回的对象 (dist) 在我的 20 个观察值(行)之间包含 190 个距离。我假设,它是一个 "unfurled" 三角矩阵 - 第一行和第二行之间有距离,然后,可能在第一行和第三行之间,...在第一行和第二十行之间,然后在第二行和第三行之间,第二和第四,等等,等等

不过,我不确定。并且:我如何构建一个对称的 20 x 20 矩阵,其中包含距离?

我的终极objective: 对于每个观察(行),我想找到它最近的 5 个邻居(即距离它最近的行)并总结这 5 个距离。如果我有一个方阵,我可以只对每一列应用一个函数。但是现在我不确定如何处理 'dist'.

非常感谢您的帮助!

import numpy as np
import pandas as pd
# Generate fake Pandas data frame
a = pd.Series(np.random.normal(1, 0.1, 20))
df = pd.DataFrame(a, columns=['a'])
df['b'] = pd.Series(np.random.normal(2, 0.1, 20))
df['c'] = pd.Series(np.random.normal(3, 0.1, 20))
import scipy
dist = scipy.spatial.distance.pdist(df, metric='euclidean')

dist.shape#(190,)

您可以将 dist 传递给 scipy.spatial.distance.squareform。它将成对距离的 n×1 数组转换为方阵形式。

d_matrix = scipy.spatial.distance.squareform(dist)