Python 基于txt文件坐标的粒子跟踪
我有一些来自OpenFoam模拟的粒子轨迹数据。 数据如下所示:Python 基于txt文件坐标的粒子跟踪,python,numpy,matplotlib,Python,Numpy,Matplotlib,我有一些来自OpenFoam模拟的粒子轨迹数据。 数据如下所示: 0.005 0.00223546 1.52096e-09 0.00503396 0.01 0.00220894 3.92829e-09 0.0101636 0.015 0.00218103 5.37107e-09 0.0154245 ..... 第一行是时间,然后是x,y,z坐标。 在我的文件夹中,每个跟踪的粒子都有一个文件 我想计算每个时间步中每个粒子的速度和位移 最好以类似粒子[1].time[0.01]的方式输入位置数据
0.005 0.00223546 1.52096e-09 0.00503396
0.01 0.00220894 3.92829e-09 0.0101636
0.015 0.00218103 5.37107e-09 0.0154245
.....
第一行是时间,然后是x,y,z坐标。
在我的文件夹中,每个跟踪的粒子都有一个文件
我想计算每个时间步中每个粒子的速度和位移
最好以类似粒子[1].time[0.01]的方式输入位置数据
已经有一个python工具来解决这种问题了吗?
非常感谢单个文件可以很容易地加载以下内容:
import numpy as np
t, x, y, z = np.loadtxt(filename, delimiter=' ', unpack=True)
现在有一个问题,您希望随着时间索引粒子位置,而Numpy只接受整数作为索引
编辑:在Python中,您可以将“position”设置为字典,以便可以使用浮点或其他任何内容对其进行索引。但现在这取决于你拥有的数据量,以及你想用它做什么。因为对于任何比在时间t选择位置更“高级”的内容,字典的效率都低于Numpy数组。如果有规则的时间步长,可以使用pandas数据帧来查找差异
import pandas as pd
dt = .005 #or whatever time difference you have
df = pd.read_csv(<a bunch of stuff indicating how to read the file>)
df['v_x'] = df.diff(<the x colum>)
df['v_x'] = df['v_x']/dt
将熊猫作为pd导入
dt=0.005#或任何时差
df=pd.read_csv()
df['v_x']=df.diff()
df['v_x']=df['v_x']/dt
你“几乎”不需要numpy。我用一些初始方法创建了一个简单的类层次结构。如果你喜欢这种方法,你可以从中改进。请注意,我是从一个字符串创建的,您应该对文件中的行使用而不是string.split
方式
import numpy
class Track(object):
def __init__(self):
self.trackpoints = []
def AddTrackpoint(self, line):
tpt = self.Trackpoint(line)
if self.trackpoints and tpt.t < self.trackpoints[-1].t:
raise ValueError("timestamps should be in ascending order")
self.trackpoints.append(tpt)
return tpt
def length(self):
pairs = zip(self.trackpoints[:-1], self.trackpoints[1:])
dists = map(self.distance, pairs)
result = sum(dists)
print result
def distance(self, points):
p1, p2 = points
return numpy.sqrt(sum((p2.pos - p1.pos)**2)) # only convenient use of numpy so far
class Trackpoint(object):
def __init__(self, line):
t, x, y, z = line.split(' ')
self.t = t
self.pos = numpy.array((x,y,z), dtype=float)
entries = """
0.005 0.00223546 1.52096e-09 0.00503396
0.01 0.00220894 3.92829e-09 0.0101636
0.015 0.00218103 5.37107e-09 0.0154245
""".strip()
lines = entries.split("\n")
track = Track()
for line in lines:
track.AddTrackpoint(line)
print track.length()
导入numpy
类轨迹(对象):
定义初始化(自):
self.trackpoints=[]
def AddTrackpoint(自身、线路):
tpt=自跟踪点(线路)
如果self.trackpoints和tpt.t
能否提供更大的数据集?也许在一个星期内?(你知道,你无论如何都应该有一个GitHub帐户…;o)GitHub完成了。。。谢谢你的建议!