通过重叠索引连接点

时间:2018-07-30 14:52:39

标签: python pandas object tracking

我有一大堆包含x和y坐标点的数组。每个点还具有自己的唯一标识符。阵列按时间顺序排列(每个阵列是电影的单个帧,点表示电影中的“对象”)。一些点出现在几帧上,坐标略有不同。 我使用KDtrees搜索上一个和下一个数组(帧)中每个点的最近邻居。现在,每个点都附加有其过去和将来的邻居的标识符。我将这些点存储在具有所有必要属性(x,y,标识符,过去的邻居ID,将来的邻居ID)的自定义python对象列表中。

我现在需要根据这些重叠的过去和将来的标识符将这些点连接到更长的轨道中。这是一个图形表示,以防万一我不清楚 enter image description here

我尝试使用以下递归函数来做到这一点:

def create_tracks(self):
    if self.track[-1].future_neighbor.ident is None:
        pass
    else:
        self.track.append(self.track[-1].future_neighbor)
        self.create_tracks()

其中future_neighbor是一个点(存储为自定义对象),. ident是它在整个点列表中的唯一标识符。这适用于较短的迹线,但对于很长的迹线则达到递归限制。如果可以简化的话,我还将每个点及其过去和将来的邻居存储在pandas数据框中。

另一个想法是做这样的事情:

my_array = np.array([[np.nan,1,2],[2,3,4],[4,5,6]]) #where each number is the unique ID of a point

#a seed is a point without a past neighbor -> start of a track
seeds_list = [i[1:].tolist() for i in my_array if np.isnan(i[0])]
for i in seeds_list:
    for p in my_array:
        if p[1] == i[-1]:
           i.append(p[2])

这也起作用,遍历每个种子点,然后遍历所有点的整个数组,并将其ID附加到种子点的ID上。但是,由于它是foor循环中的一个for循环,因此我的大型(几个100k点)数据集要花一些时间。

有没有更好的方法来做这样的事情?

1 个答案:

答案 0 :(得分:0)

像这样吗?

~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.4.3, https://www.playframework.com
~ framework ID is test
~
~ Oops,
~ Cannot fetch the modules list from https://www.playframework.com/modules (403)...