2016-08-18 12 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ツールがありますか?

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

今numpyのが唯一の指標として整数を受け入れるのに対し、あなたは、時間の経過とともに指数particule位置に希望のような問題がある: おかげでたくさん

+0

もっと大きなデータセットを提供できますか?おそらく[GitHub Gist](https://gist.github.com)で? (とにかく、あなたはGitHubアカウントを持っていなければならない...)o) – heltonbiker

+0

GitHub done ...アドバイスありがとう! – Sibi

答えて

0

個々のファイルを簡単のようなものがロードされます。

編集:Pythonでは、「位置」を辞書にして、浮動小数点数などでインデックスを付けることができます。しかし、今はあなたが持っているデータの量、そしてあなたがそのデータで何をしたいのかが分かります。辞書はNumpy配列よりも効率的ではないので、時間tでの位置を選択するよりも少し進んだだけです。あなたは、通常の時間ステップを使用している場合

+0

ありがとう、今あなたのやり方でそれを管理... – Sibi

2

することは、あなたが「ほとんど」そのためにnumpyのを必要としないの違いに

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

を見つけるために、パンダのデータフレームを使用することができます。いくつかの初期メソッドを持つ単純なクラス階層を作成しました。あなたがそのアプローチを好むなら、あなたはそれを改善することができます。文字列から作成していることに注意してください。string.splitの代わりにfor line in fileを使用してください。

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() 
関連する問題