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

时间:2017-11-03 01:28:04

标签: python pandas similarity euclidean-distance

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

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

然而,我不确定。并且:我怎样才能构建一个20×20矩阵的对称矩阵?

我的最终目标: 对于每个观察(行),我想找到它最近的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,)

1 个答案:

答案 0 :(得分:2)

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

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