Python 3.x 基于函数计算nxn距离矩阵
下午好 我从一张类似于以下内容的表格开始:Python 3.x 基于函数计算nxn距离矩阵,python-3.x,pandas,numpy,Python 3.x,Pandas,Numpy,下午好 我从一张类似于以下内容的表格开始: Attribute1 Attribute2 Attribute3 John 1 2 3 Jen 4 5 6 Jo 7 8 9 John Jen Jo John 0 x x Jen x 0 x Jo
Attribute1 Attribute2 Attribute3
John 1 2 3
Jen 4 5 6
Jo 7 8 9
John Jen Jo
John 0 x x
Jen x 0 x
Jo x x 0
我已经创建了一个函数->dist(I,j),用于计算表中任意两个人(I和j)之间的L1距离。例如,John和Jen之间的L1距离为dist(0,1)=4-1 |+| 5-2 |+| 6-3 |=9。还需要注意的是,我将每个人都称为他们的行索引(John=0,Jen=1,等等)
接下来,我需要创建一个距离矩阵来计算所有成对的人之间的距离。它将如下所示:
Attribute1 Attribute2 Attribute3
John 1 2 3
Jen 4 5 6
Jo 7 8 9
John Jen Jo
John 0 x x
Jen x 0 x
Jo x x 0
x是这两个人之间各自的L1距离
您知道如何实现这一点吗?您创建的函数看起来像标准城市街区(曼哈顿)距离,这意味着您可以通过简单调用SciPy库函数来实现:
from scipy.spatial.distance import squareform, pdist
dm = pd.DataFrame(squareform(pdist(df, metric='cityblock')), index=df.index, columns=df.index)
结果:
John Jen Jo
John 0.0 9.0 18.0
Jen 9.0 0.0 9.0
Jo 18.0 9.0 0.0
有关更多详细信息,请参阅和文档
请注意,如果您的实际功能比您描述的城市街区功能更复杂,则仍然可以使用这些SciPy功能和自定义定义的距离度量
虽然在这种特定情况下没有必要,但如果需要的话,下面是如何应用自定义距离函数的。首先创建一个函数,该函数将两行作为输入,并返回单个距离数:
def my_distance_function(row1, row2):
return np.abs(row1 - row2).sum()
然后按如下方式应用:
dm = pd.DataFrame(squareform(pdist(df, metric=my_distance_function)), index=df.index, columns=df.index)
这与SciPy库中的“cityblock”函数的结果相同,但您可以看到,如果需要,现在可以调整它以满足您的需要