【问题标题】:Find the distance traveled from (x,y) coordinates查找从 (x,y) 坐标行进的距离
【发布时间】:2017-10-26 15:21:44
【问题描述】:

我目前有一个 python 脚本,它读取一个 3 列的文本文件,其中包含步行者的 x 和 y 坐标以及他们行走的时间。

我已读入此数据并将其分配到 numpy 数组中,如下代码所示:

import numpy as np
import matplotlib.pyplot as plt

data = np.loadtxt("info.txt", delimiter = ',')

x = data[:,0]
y = data[:,1]
t = data[:,2]

文件格式如下(x,y,t):

5907364.2371    -447070.881709  2193094
5907338.306978  -447058.019176  2193116
5907317.260891  -447042.192668  2193130

我现在想找出步行者所行驶的距离作为时间的函数。我能想到的一种方法是在一个循环中将 x 坐标的差异和 y 坐标的所有差异相加。然而,这似乎是一个非常冗长的方法,我认为它可以通过一种数值积分来解决。有人知道我能做什么吗?

【问题讨论】:

  • 可以分享几行文本文件吗?
  • 给我们看一些数据。
  • 看起来更像是一道数学题,而不是编程题。
  • 如果是具体步骤,则不需要集成。
  • 已编辑数据示例

标签: python scipy numerical-methods numerical-integration


【解决方案1】:

要计算“沿途”的距离,必须先获取每一步的距离。

这可以通过索引dx = x[1:]-x[:-1] 以组件方式获得。然后每步的距离是“dx**2+dy**2 的平方根”。请注意,这个数组的长度减一,因为相对于步数的间隔少了一个。这可以通过将距离“0”分配给第一次数据来完成。这就是下面“连接”行的作用。

这里没有数值积分,而是累积和。要执行数值积分,您需要运动方程(例如)。

额外更改:我使用 np.loadtxtunpack=True 参数来节省几行。

import numpy as np
import matplotlib.pyplot as plt

x, y, t = np.loadtxt("info.txt", unpack=True)

dx = x[1:]-x[:-1]
dy = y[1:]-y[:-1]

step_size = np.sqrt(dx**2+dy**2)

cumulative_distance = np.concatenate(([0], np.cumsum(step_size)))

plt.plot(t, cumulative_distance)

plt.show()

【讨论】:

    【解决方案2】:

    有几种方法可以获得点之间的欧几里得距离:

    麻木:

    import numpy as np
    dist = np.linalg.norm(x-y)
    dist1= np.sqrt(np.sum((x-y)**2)))
    

    Scipy:

    from scipy.spatial import distance
    dist = distance.euclidean(x,y)
    

    【讨论】:

    • 谢谢,scipy 函数符合我正在寻找的路线,但是我希望距离作为时间的函数。不过我可以解决这个问题!
    • 酷。你是说速度吗?
    • 这个人在一段时间后步行的总距离,而不是整个步行的总距离。
    • @WillC 在距离变量上使用numpy.cumsum()
    【解决方案3】:

    通常,要获得步行距离,您需要总结较小的距离。您的步行者可能不是在网格上行走(即 x 中的一步和 y 中的一步),而是在对角线上(想想勾股定理)

    所以,在 python 中它可能看起来像这样......

    distanceWalked = 0
    for x_y_point in listOfPoints:
        distanceWalked = distanceWalked  + (x_y_point[0] **2 + x_y_point[1] **2)**.5
    

    其中 listOfPoints 类似于 [[0,0],[0,1],[0,2],[1,2],[2,2]]

    或者,您可以使用 pandas。

    import pandas as pd
    df = pd.read_csv('info.txt',sep = '\t')
    df['helpercol'] = (df['x']**2 +df['y']**2 )**.5
    df['cumDist'] = df['helpercol'].cumsum()
    

    现在,您将在数据框中获得每次累积距离

    【讨论】:

      猜你喜欢
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 2018-02-15
      • 2011-10-01
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      相关资源
      最近更新 更多