【发布时间】:2018-07-30 14:52:38
【问题描述】:
我有一个包含 x 和 y 坐标点的数组的大列表。每个点也有它自己的唯一标识符。数组按时间顺序排列(每个数组是电影的单帧,点代表电影中的“对象”)。一些点出现在几个帧上,坐标略有不同。 我使用 KDtrees 来搜索前一个和后一个数组(帧)中每个点的最近邻。现在,每个点都附有其过去和未来邻居的标识符。我将这些点存储在一个自定义 python 对象列表中,其中包含所有必要的属性(x、y、标识符、过去的邻居 ID、未来的邻居 ID。
我现在需要根据这些重叠的过去和未来标识符将这些点连接成更长的轨道。这是一个图形表示,以防我没有说清楚
我尝试使用以下递归函数来做到这一点:
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。但是,由于它是一个 for 循环中的一个 for 循环,因此我的大型(几个 100k 点)数据集需要很长时间。
有没有更好的方法来做这样的事情?
【问题讨论】:
标签: python pandas object tracking