2017-01-19 11 views
0

私は多くの軌道ファイルを持っています。それらのそれぞれは、位置xyおよびzを表す3つの列を持ちます。私は、基本的に次のように定義されている平均位置を計算したい - 与えられた行について、すべての軌道からの平均をxとして計算する。同様にyおよびzディメンションについても同様です。numpyで多くの軌道からの平均軌道を計算する

したがって、私はこれらの配列のそれぞれを反復処理し、すべてxを1つのリストに格納し、yzについても同様に格納しています。後で私は平均を計算しています。サンプルコードの下を参照してください。

import numpy as np 
import pandas as pd 

file_list = ['test1_1', 'test2_4', 'test3_1', 'test4_3', 'test1_3'] 
position_data_list = [] 
for f in file_list: 
    position_data = pd.read_csv(f) 
    position_data_list.append(position_data.values) 

position_x_list = [] 
position_y_list = [] 
position_z_list = [] 
for position_data in position_data_list: 
    px = _position_data[:, 0] 
    py = _position_data[:, 1] 
    pz = _position_data[:, 2] 
    position_x_list.append(px) 
    position_y_list.append(py) 
    position_z_list.append(pz) 

position_x_list = np.array(position_x_list).T 
position_y_list = np.array(position_y_list).T 
position_z_list = np.array(position_z_list).T 

position_x_mean = np.mean(position_x_list, axis=1) 
position_y_mean = np.mean(position_y_list, axis=1) 
position_z_mean = np.mean(position_z_list, axis=1) 

同じことを行うには良い方法はありますか?

上記のコードを説明します。 filesfile_1,file_2およびfile_3であるとする。各ファイルはx,yおよびzの列を持ち、各行はタイムスタンプt1,t2,t3t4およびt5となります。 x1ファイルfile_1file_2及び行t1file_3からxの平均である平均軌道は、t1からt5にすべての行を含むべきです。など...

+0

をサンプルケースを追加しますか? – Divakar

+0

@Divakar:どういう意味ですか?前述のように、軌跡ファイル 'test1_1'は3つの列x、y、zを持つcsvです。 –

+0

しかし、私はそれらのCSVファイルが何であるか分かりません。ですから、 'position_data_list'に入っている最小限の代表的なデータがあなたを助けてくれるかもしれません。彼らの形や大きさなどと同じように、 – Divakar

答えて

2

実際にパンダは非常に強力で、単にデータを読むだけではありません。すでにデータをパンダのデータフレームに読み込んだら、データフレームを連結して、各カラムの平均をパンダで計算することができます。各タイムスタンプの平均を計算しようとしている場合は、groupby関数を試すことができます。あなたのタイムスタンプは、 "TS" であるため、以下を試した後、列名と仮定すると:

import pandas as pd 
file_list = ['test1_1', 'test2_4', 'test3_1', 'test4_3', 'test1_3'] 
df = pd.DataFrame()    # Create an empty dataframe 
for file in file_list: 
    df2 = pd.read_csv(file)  # Read data and store the results in df2 
    df = pd.concat([df, df2]) # Concatenate your dataframes and store the results in df 
print(df.groupby('ts').mean()) # Assuming 'ts' is the column of time stamp, print the results 

入力:

file1: 

ts x y z 
t1 1 3 5 
t2 2 4 6 
t3 3 5 7 
t4 4 6 8 
t5 5 7 9 

file2: 

ts x y z 
t1 1 4 5 
t2 2 6 6 
t3 3 8 7 
t4 4 10 8 
t5 5 12 9 

を出力:

 x y z 
ts    
t1 1.0 3.5 5.0 
t2 2.0 5.0 6.0 
t3 3.0 6.5 7.0 
t4 4.0 8.0 8.0 
t5 5.0 9.5 9.0 
+0

もう一度説明しましょう。 'files'は' file_1'、 'file_2'そして' file_3'です。各ファイルには 'x'、' y'、 'z'カラムがあり、各行に' t1'、 't2'、' t3'、 't4'、' t5'というタイムスタンプがあります。平均軌道には、 't1'から' t5'までのすべての行が含まれていなければなりません。 'x1'は行' t1'の 'file_1'、' file_2'、 'file_3'の' x'の平均です。など... –

+1

あなたは、すべてのタイムスタンプではなく、各タイムスタンプの平均を計算しますか? –

+0

うん。まったく! –

0

ですから、それぞれの座標を平均化したいですフレーム上ですべてのフレームをメモリ内の配列として持つことができます。次に、すべての軌跡を1つの次元としてフレームを表現し、もう1つは動いている要素(現在の行)を表し、最後の次元は軸(現在の列)を表します。次元がその順番であると仮定すると、その配列の最初の次元の平均値が求められます。my_array.mean(axis=0)を使用できます。

私はあなたの例のように、次のコードを使用してテスト・システムで同じ結果を得た:

file_list = glob('csv_frames/*') 

position_data_list = [] 
for frame in file_list: 
    position_data_list.append(numpy.loadtxt(frame, delimiter=',')) 
# Convert the list of arrays into a 3D array 
position_data_list = numpy.asarray(position_data_list) 

# Actually calculate the averaged coordinates 
position_mean = position_data_list.mean(axis=0) 

# If realy you need each axis on its own array 
position_x_mean = position_mean[:, 0] 
position_y_mean = position_mean[:, 1] 
position_z_mean = position_mean[:, 2] 

私の例では、私は、CSVファイルを読み込むためにnumpy.loadtxtを使用しています。ファイルによっては、引数を調整する必要があるかもしれません。また、パンダを使用してファイルを読み込み、as_matrixメソッドを使用してDataFrameから配列を抽出することもできます。私はMDAnalysisを用いた分子動力学シミュレーション軌道から私のテストフレームを内蔵し

import numpy 
import MDAnalysis as mda 
from MDAnalysisTests.datafiles import TPR, XTC 

# Read the trajectory 
u = mda.Universe(TPR, XTC) 
# Write each frame in a separate CSV file 
for ts in u.trajectory: 
    numpy.savetxt('csv_frames/frame_{}.csv'.format(ts.frame), 
        u.atoms.positions, delimiter=',') 
0
import pandas as pd 
import glob, os 


file_list = ['test1_1', 'test2_4', 'test3_1', 'test4_3', 'test1_3'] 
position_data_list = pd.DataFrame() 
for f in file_list: 
    position_data_list =position_data_list.append(pd.read_csv(tfile)) 

position_data_list.columns=['X','Y','Z'] 
print position_data_list["Y"].mean() 
print position_data_list["X"].mean() 
print position_data_list["Z"].mean() 

入力

5.742023, 0.193241, 2.874091 
8.742023, 0.35, 2.78 
23, 0.55, 2.89 
7.742023, 0.65, .8274091 

出力

0.516666666667 
13.1613486667 
2.16580303333