查找从 (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.loadtxt
和 unpack=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()
我目前有一个 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.loadtxt
和 unpack=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()