python - 2 列行之间的豪斯多夫距离

标签 python pandas

给定一个数据框:

df = 

    car     lat    lon
0   0   22.0397 3.6531
1   1   22.0367 3.5095
2   2   22.0713 3.5346
3   3   22.1249 3.5922

我已经计算了欧几里德距离以获得矩阵:

from scipy.spatial.distance import squareform, pdist

pd.DataFrame(squareform(pdist(df.iloc[:, 1:])), columns=df1.car.unique(), index=df1.car.unique())

现在我想得到Hausdorff Distance并得到矩阵。

<小时/>

我尝试过:

def hausdorff(p, q):
    p = p #Need to choose row
    q = q #Need to choose row
    return hausdorff_distance(p, q, distance="euclidean")

distance_df = squareform(pdist(df1.values, hausdorff))
euclidean = pd.DataFrame(distance_df)

最佳答案

无需选择行,这样做 pdist为你。它为所有行组合调用用户提供的函数。因此,只需将行向量提供给 hausdorff 即可。唯一需要注意的是 hausdorff_distance需要两个二维数组作为输入,因此您需要重新调整它们的形状。

def hausdorff(p, q):
    p = p.reshape(-1,2)
    q = q.reshape(-1,2)
    return hausdorff_distance(p, q, distance="euclidean")

pd.DataFrame(squareform(pdist(df.iloc[:, 1:], hausdorff)), columns=df.car.unique(), index=df.car.unique())

结果:

          0         1         2         3
0  0.000000  0.143631  0.122641  0.104728
1  0.143631  0.000000  0.042745  0.120907
2  0.122641  0.042745  0.000000  0.078681
3  0.104728  0.120907  0.078681  0.000000

<小时/> 上面只是回答了如何将用户定义函数与pdist一起使用的技术问题。根据您想要实现的目标,我想您需要提供不止一行的数组,例如给定汽车的所有行,如下例所示:

import itertools as it

df1 = pd.DataFrame({'car': [0,0,1,1,2,2], 'lat': 22+pd.np.random.rand(6), 'lon': 3+pd.np.random.rand(6)})
#   car        lat       lon
#0    0  22.426797  3.006383
#1    0  22.894152  3.558360
#2    1  22.657756  3.969983
#3    1  22.788719  3.969007
#4    2  22.025103  3.854048
#5    2  22.867389  3.760920

cars = df1.car.unique()
p = []
for c in it.combinations(cars, 2):
    p.append(hausdorff_distance( df1.loc[df1.car==c[0],['lat','lon']].to_numpy(), df1.loc[df1.car==c[1],['lat','lon']].to_numpy()))
pd.DataFrame(squareform(p), columns=cars, index=cars)

结果:

          0         1         2
0  0.000000  0.990892  0.917975
1  0.990892  0.000000  0.643188
2  0.917975  0.643188  0.000000

但请注意,豪斯多夫距离是有向距离,即 h(x,y) != h(y,x)。 hausdorff_distance 计算 h(x,y) 和 h(y,x) 的最大值,因此您无法从中填充距离矩阵。您可以使用directed_hausdorff用于正确创建距离矩阵。

关于python - 2 列行之间的豪斯多夫距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59231661/

相关文章:

python - QSortFilterProxyModel 不应用 SortRole

python - 如何删除 Pandas 中包含少于行数 1% 的非零列?

python - 如何通过对嵌套列表中的单词进行词干处理来获取嵌套列表?

相当于 R 函数 sweep() 的 Python numpy 或 pandas

python - 使用另一个数据帧替换数据帧中的空值

pandas - 在 Pandas 数据框中搜索字符串列表并将每个搜索字符串添加到新列

python - 将 Pandas 数据框列转换为 np.datetime64

javascript - 尝试在 Jython 中使用 htmlunit 抓取 javascript 网站时出现问题

python - python中的绝对路径和相对路径问题

python - Heroku Python仅处理第一个异常