粒子跟踪来自txt文件的坐标

时间:2016-08-18 09:05:52

标签: 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]的方式输入位置数据会很不错。

是否已存在针对此类问题的python工具? 非常感谢

3 个答案:

答案 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()