Подключение точек путем перекрытия индексов

90
4

У меня есть большой список массивов, содержащих точки с координатами x и y. Каждая точка также имеет свой собственный уникальный идентификатор. Массивы располагаются в последовательности времени (каждый массив представляет собой одиночный кадр фильма, а точки представляют "объекты" в фильме). Некоторые точки появляются на нескольких кадрах, с немного разными координатами. Я использовал KDtrees для поиска ближайшего соседа каждой точки в предыдущем и последующем массиве (кадре). Каждая точка теперь имеет идентификатор ее прошлых и будущих соседей, прикрепленных к ней. Я сохраняю точки в списке пользовательских объектов python со всеми необходимыми атрибутами (x, y, идентификатор, идентификатор прошлого соседа, идентификатор будущего соседа.

Теперь мне нужно подключить эти точки к более длинным трекам, основываясь на этих перекрывающихся прошлых и будущих идентификаторах. Здесь графическое представление, если я не дал себе понять 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])

Это также работает, оно выполняет итерацию через каждую начальную точку, затем выполняет итерацию по всему массиву ВСЕХ точек и добавляет их идентификаторы к идентификатору начальной точки. Тем не менее, поскольку это цикл for внутри цикла foor, он требует возраста для моих больших (несколько 100 тыс. Точек) наборов данных.

Есть ли лучший способ сделать что-то подобное?

спросил(а) 2018-07-30T17:52:00+03:00 2 года, 2 месяца назад
1
Решение
82

Что-то вроде этого?

>>> my_array = np.array([[np.nan,1,2],[2,3,4],[4,5,6]])
>>> pd.Series(my_array.ravel()).drop_duplicates().values
array([nan, 1., 2., 3., 4., 5., 6.])

ответил(а) 2018-08-06T19:58:00+03:00 2 года, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема