我目前有一个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坐标的所有差异相加。这似乎是一个非常漫长的方法,但我认为它可以用一种数值积分来解决。有没有人对我能做什么有任何想法?
答案 0 :(得分:3)
要计算距离"沿途",您必须首先获得每一步的距离。
这可以通过索引dx = x[1:]-x[:-1]
在组件方面获得。然后,每步的距离为" dx的平方根** 2 + dy ** 2"请注意,此数组的长度小于1,因为相对于步数的间隔减少一个。这可以通过分配距离" 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()
答案 1 :(得分:0)
通常,为了让步行距离更远,您可以总结较小的距离。你的步行者可能不是在网格上行走(也就是说,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()
现在,您的数据框中每次累积距离
答案 2 :(得分:0)
有几种方法可以获得点之间的欧几里德距离:
Numpy:
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)