我有一些来自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]的方式输入位置数据会很不错。
是否已存在针对此类问题的python工具? 非常感谢
答案 0 :(得分:2)
如果您有常规时间步骤,则可以使用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
答案 1 :(得分:0)
可以轻松加载单个文件,例如:
import numpy as np
t, x, y, z = np.loadtxt(filename, delimiter=' ', unpack=True)
现在有一个问题,因为你想用时间索引粒子位置,而Numpy只接受整数作为索引。
编辑:在Python中,您可以将“位置”设置为字典,以便您可以使用浮点数或其他任何内容对其进行索引。但现在归结为您拥有的数据量以及您想要使用的数据。因为词典的效率低于Numpy数组,所以比在时间t选择位置更加“先进”。
答案 2 :(得分:0)
你“几乎”不需要那个numpy。我用一些初始方法创建了一个简单的类层次结构。如果你喜欢这种方法,你可以从中改进。请注意,我是从字符串创建的,您应该使用for line in file
而不是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()