2016-02-12 209 views
1

我在哪裏我的數組存儲這樣的粒子跟蹤程序工作:計算在python速度和加速度爲大numpy的陣列

x_pos y_pos path# slice# 
1  10  1  1 
2  11  1  2 
3  12  1  3 
5  2  2  1 
7  4  2  2 
9  6  2  3 
11  8  2  4 
... 
2  6  N  100 

,其中每個路徑數量對應於一個單個粒子的軌跡和切片編號是包含粒子的圖像編號。

我想計算每個路徑的速度和加速度(對於路徑的每個段,然後是整個路徑)。目前,我使用(假設我的時間步長爲1):

vel_x = np.diff(data['x_Pos']) 
acc = np.diff(vel_x) 

這個效果很好,但我必須去通過陣列,並採取了不正確的值(即所在的路徑#變化)。有誰知道這樣做的快速方法,因爲我的數組長度接近100萬?或者,更好的方法來計算速度和加速度?

任何意見或建議將不勝感激,因爲我是相對較新的python!

回答

2

嘗試np.where

vel_x = np.where(np.diff(data['path#'])==0, np.diff(data['x_Pos']), np.inf) 

結果( 「INF」 只是爲了顯示數據是無效的):

array([ 1., 1., inf, 2., 2., 2.]) 
+0

我想'np.nan'會比'NP更好。 inf'。如果您將數字除以無效值,您會期望得到另一個無效值,而不是0. – Goyo

+0

感謝RootTwo和@Goyo。我最終做了類似的事情,但我認爲你的答案要容易得多! - 對數組進行排序 'results = results.sort_values(by = ['Count','Slice'])' - 將索引設置爲count/slice 'results = results.set_index(['Count','Slice ''))' - 在results.index.get_level_values('Count')。中使用索引 'for i.ilo(): results ['Vel_x'] [ii] .iloc [: - 1] = np。 diff(results ['X'] [ii]) results ['Vel_y'] [ii] .iloc [: - 1] = np.diff(results ['Y'] [ii])' – AlC