查找从 (x,y) 坐标移动的距离

Find the distance traveled from (x,y) coordinates

我目前有一个 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 坐标的所有差异求和。然而,这似乎是一个非常冗长的方法,我认为它可以通过一种数值积分来解决。有人知道我能做什么吗?

通常,要计算步行距离,您需要将较小的距离相加。您的助行器可能不是在网格上行走(即 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()

现在,您的数据框中将有每次累积距离

点之间的欧式距离有几种获取方式:

麻木:

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)

要计算距离"along the way",您必须先获取每一步的距离。

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

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

额外更改:我使用 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()