2016-08-18 46 views
2

我有一些來自OpenFoam模擬的粒子跟蹤數據。 的數據是這樣的:通過txt文件中的座標進行粒子跟蹤

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

您能否提供一個大型的數據集?也許在[GitHub Gist](https://gist.github.com)中? (你知道,你應該擁有一個GitHub賬戶......; o) – heltonbiker

+0

GitHub完成了...感謝您的建議! – Sibi

回答

0

個人文件將很容易地加載的東西,如:

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

現在有一個問題,因爲你想指數particule位置的時間變化,而NumPy的將只接受整數作爲指標。

編輯:在Python中,您可以使「位置」成爲一個字典,以便您可以使用浮點數或其他任何內容對其進行索引。但現在,這取決於您擁有的數據量以及您想要處理的數據量。因爲字典比Numpy數組的效率要低,而不是僅僅在時間t選擇位置,所以對於任何更「先進」的事情來說都是如此。

+0

謝謝,現在用一種方式管理它... – Sibi

2

如果你有固定的時間步驟,你可以用一個數據框熊貓找到差異

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

你「幾乎」不需要爲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()