Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 基于函数计算nxn距离矩阵_Python 3.x_Pandas_Numpy - Fatal编程技术网

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”函数的结果相同,但您可以看到,如果需要,现在可以调整它以满足您的需要