所以我有两个不同的文件,其中包含一个正方形地图(512x512 像素)中的多个轨迹。每个文件都包含有关每个粒子在轨迹/轨迹(X 和 Y 坐标)内的空间位置以及该点所属的轨迹/轨迹 (TRACK_ID) 的信息。我的目标是找到一种方法在两个文件之间聚集相似的轨迹。我找到了一个很好的方法(距离聚类比较),但是代码太慢了。我只是想知道是否有人有一些建议可以让它更快。
我的文件看起来像这样:
我实施的方法根据称为 Fréchet 距离的东西(可能与此处无关)找到了类似的轨迹。您可以在下面找到我编写的函数,但简而言之,这是基本原理:
pandas.groupby
使用file1 (growth_xml
) 和 file2 (shrinkage_xml
)的函数按轨道对所有点进行分组- 对于
growth_xml
(循环)中的每个轨迹,我与中的每个轨迹进行比较growth_xml
- 如果他们通过了我定义的 Fréchet 距离标准(一个 if 语句),我将两个轨道都保存在一个新表中。您可以看到我调用的附加过滤条件
delay
,但我想在这里解释并不重要。
非常简单:
def distance_clustering(growth_xml,shrinkage_xml):
coords_g = pd.DataFrame() # empty dataframes to save filtered tracks
coords_s = pd.DataFrame()
counter = 0 #initalize counter to count number of filtered tracks
for track_g, param_g in growth_xml.groupby('TRACK_ID'):
# define growing track as multi-point line object
traj1 = [(x,y) for x,y in zip(param_g.POSITION_X.values, param_g.POSITION_Y.values)]
for track_s, param_s in shrinkage_xml.groupby('TRACK_ID'):
# define shrinking track as a second multi-point line object
traj2 = [(x,y) for x,y in zip(param_s.POSITION_X.values, param_s.POSITION_Y.values)]
# compute delay between shrinkage and growing ends to use as an extra filter
delay = (param_s.FRAME.iloc[0] - param_g.FRAME.iloc[0])
# keep track only if the frechet Distance is lower than 0.2 microns
if frechetDist(traj1, traj2) < 0.2 and delay > 0:
counter += 1
param_g = param_g.assign(NEW_ID = np.ones(param_g.shape[0]) * counter)
coords_g = pd.concat([coords_g, param_g])
param_s = param_s.assign(NEW_ID = np.ones(param_s.shape[0]) * counter)
coords_s = pd.concat([coords_s, param_s])
coords_g.reset_index(drop = True, inplace = True)
coords_s.reset_index(drop = True, inplace = True)
return coords_g, coords_s
主要问题是大多数时候我有超过 2000 首曲目(!!),而且这种成对组合需要很长时间。我想知道是否有一种简单有效的方法来做到这一点。也许通过在多个小区域而不是整个地图中进行成对组合?没有把握...