【问题标题】:Calculate the distance between all other points in a TSV file?计算 TSV 文件中所有其他点之间的距离?
【发布时间】:2018-12-19 19:43:20
【问题描述】:

我有一个填充有 n 个数据点的 TSV 文件,我想计算所有点之间的距离。我有这样的事情:

我想做的是.iloc 功能

import pandas as pd
x = pd.read_csv('data.tsv', sep='\t')
print (x)

while True: xcord= (int)

我在想你可以迭代地为每个点加 1,但我不知道该怎么做。

【问题讨论】:

  • distance between all other points 是什么意思?你能给我们一个预期输出的例子吗?
  • 是的,对不起!例如,A 和 B 之间的距离为 d = 4.073928。 A 和 C 之间是 d = 3.06557。然后我想要A和D,A和E之间的距离,等等。我还想要 B 和 C、B 和 D 之间的距离,等等。理想情况下,结果看起来像一个相关矩阵,其中 0 是自我,然后您可以截取其他 20 个点之间的距离。我使用的公式是 sqrt((x2-x1)^2 +(y2-y1)^2 +( z2-z1)^2)
  • 如果我的回答解决了您的问题,您可以将其标记为已接受吗?
  • 您显示的代码并不是真正的尝试。例如,它不包括您在文本中提到的.iloc 功能。请显示针对该问题的实际代码尝试。

标签: python python-2.7 pandas numpy math


【解决方案1】:

使用distance_matrix的解决方案

您可以继续使用scipy.spatial.distance_matrix

假设您的 DataFrame 是 my_dataframe

import pandas as pd
import scipy as sp    

points = pd.DataFrame(my_dataframe, columns=["X", "Y", "Z"]).astype(float)
distance_matrix = sp.spatial.distance_matrix(points, points)

可视化结果

我们可以使用seabord.heatmap来可视化得到的结果:

from matplotlib import pyplot as plt
import seaborn as sns

labels = my_dataframe["points"]

plt.rcParams['figure.figsize'] = [10, 10]
plt.axis('scaled')
sns.heatmap(distance_matrix,
        annot=True,
        cbar = False,
        fmt="0.2f",
        cmap="YlGnBu",
        xticklabels=labels,
        yticklabels=labels)
plt.title("Distance matrix")

结果是:

一个小的文本示例

我们可以创建一个小的文本示例,通过它可以帮助我们逐步理解输入和输出。让我们考虑一个只有两点的 DataFrame:

生成示例数据框

import pandas as pd
import numpy as np

a = np.random.uniform(100, size=(2, 3))
my_dataframe = pd.DataFrame(np.hstack([[["A"], ["B"]], a]), columns=["points", "X", "Y", "Z"])

我们生成的 DataFrame 如下所示:

分割点和标签

我们将标签和点分开:

points = pd.DataFrame(my_dataframe, columns=["X", "Y", "Z"]).astype(float)
labels = my_dataframe["points"]

所以points 看起来像:

labels 看起来像:

计算距离矩阵

现在我们可以继续计算距离矩阵,执行scipy.spatial.distance_matrix

distance_matrix = sp.spatial.distance_matrix(points, points)    

得到的矩阵是:

array([[ 0.        , 93.43955419],
       [93.43955419,  0.        ]])

可视化得到的矩阵

使用与上面相同的代码,我们得到:

【讨论】:

    猜你喜欢
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 2022-11-16
    • 1970-01-01
    • 2022-09-22
    • 2014-02-28
    • 2010-10-30
    相关资源
    最近更新 更多