首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于函数计算nxn距离矩阵

基于函数计算nxn距离矩阵
EN

Stack Overflow用户
提问于 2019-03-01 02:44:46
回答 1查看 89关注 0票数 2

下午好,

我从一个类似于下表的表格开始:

代码语言:javascript
复制
      Attribute1   Attribute2   Attribute3
John     1              2            3
Jen      4              5            6
Jo       7              8            9

我已经创建了一个函数-> dist (i,j),它计算表中任意两个人(i和j)之间的L1距离。例如,John和Jen之间的L1距离为dist( 0,1 ) = |4-1| + |5-2| + |6-3| = 9。同样重要的是要注意,我将每个人称为其行索引(John =0,Jen =1等)。

接下来,我需要创建距离矩阵,该矩阵将计算所有成对的人的距离。它将如下所示:

代码语言:javascript
复制
      John  Jen  Jo
John   0     x    x
Jen    x     0    x
Jo     x     x    0

X是这两个人之间的L1距离。

你知道我该怎么做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-01 02:49:40

您创建的函数看起来像标准的城市街区(曼哈顿)距离,这意味着您可以通过简单地调用SciPy库函数来完成此操作:

代码语言:javascript
复制
from scipy.spatial.distance import squareform, pdist
dm = pd.DataFrame(squareform(pdist(df, metric='cityblock')), index=df.index, columns=df.index)

结果:

代码语言:javascript
复制
      John  Jen    Jo
John   0.0  9.0  18.0
Jen    9.0  0.0   9.0
Jo    18.0  9.0   0.0

有关更多详细信息,请参阅pdistsquareform文档。

请注意,如果您的实际函数比您所描述的City Block函数更复杂,则仍然可以将这些SciPy函数与自定义的距离度量一起使用。

虽然对于这种特定情况不是必需的,但如果需要,这里是如何应用自定义距离函数的。首先创建一个函数,该函数将这两行作为输入,并返回单个距离数:

代码语言:javascript
复制
def my_distance_function(row1, row2):
    return np.abs(row1 - row2).sum()

然后按如下方式应用:

代码语言:javascript
复制
dm = pd.DataFrame(squareform(pdist(df, metric=my_distance_function)), index=df.index, columns=df.index)

这给出了与SciPy库中的'cityblock‘函数相同的结果,但如果需要,您可以看到现在如何调整它以满足您的需要。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54932278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档