2016-08-18 1 views
2

Ich habe Partikelspurdaten aus einer OpenFoam-Simulation. Die Daten wie folgt aussieht:Partikelverfolgung nach Koordinaten aus der txt-Datei

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 
..... 

Erste Reihe Zeit ist, dann ist x, y, z-Koordinaten. In meinem Ordner habe ich eine Datei für jedes verfolgte Partikel.

Ich möchte die Geschwindigkeit und die Verschiebung für jedes Partikel in jedem Zeitschritt berechnen.

Es wäre schön, die Positionsdaten wie Partikel [1] .time [0.01] einzugeben.

Gibt es bereits ein Python-Tool für diese Art von Problem? Vielen Dank

+0

Können Sie einen größeren Datensatz bereitstellen? Vielleicht in einem [GitHub Gist] (https://gist.github.com)? (Weißt du, du solltest _ sowieso einen GitHub Account haben ...; o) – heltonbiker

+0

GitHub fertig ... danke für den Hinweis! – Sibi

Antwort

0

Einzelne Dateien würden leicht mit so etwas wie geladen werden:

import numpy as np 
t, x, y, z = np.loadtxt(filename, delimiter=' ', unpack=True) 

Jetzt ist ein Problem, da, wie Sie mit der Zeit zu indizieren particule Position möchten, während Numpy nur ganze Zahlen als Indizes akzeptieren.

bearbeiten: In Python können Sie ein Wörterbuch "positionieren", so dass Sie es mit einem Float oder irgendetwas anderem indizieren können. Aber jetzt kommt es auf die Menge an Daten an, die Sie haben und was Sie damit machen wollen. Weil Wörterbücher weniger effizient sind als Numpy-Arrays für alles, was etwas "fortgeschrittener" ist, als nur die Position zum Zeitpunkt t zu wählen.

+0

Danke, du hast es jetzt auf deine Art geschafft ... – Sibi

2

Wenn Sie regelmäßig die Zeitschritte haben, können Sie eine Pandas Datenrahmen verwenden, um den Unterschied

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 
0

Sie „fast“ nicht brauchen dafür numpy zu finden. Ich habe mit einigen Methoden eine einfache Klassenhierarchie erstellt. Sie können sich verbessern, wenn Sie den Ansatz mögen. Beachten Sie, dass ich aus einer Zeichenfolge erstellen, sollten Sie for line in file anstelle der string.split Weg verwenden.

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() 
Verwandte Themen