2016-02-12 167 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