Поиск диапазона через иерархические таблицы в numpy - PullRequest
0 голосов
/ 04 мая 2020

У меня есть очень большая 2D-форма, которая разделена на более мелкие 2D-формы, каждая из которых разделена на более мелкие и т. Д. Для нескольких уровней иерархии. Каждое из этих делений указывается в паре numpy 2d массивов с координатами начала / конца в каждой строке.

Я должен взять другой список диапазонов, и для каждого найти диапазон листа, к которому они принадлежат. Я могу вручную перемещаться по иерархии один за другим, но я делаю это для тысяч диапазонов, и я ищу способ векторизовать это через numpy.

Я могу предположить, что каждый диапазон будет нажмите ровно на одну строку таблицы, чтобы я мог легко найти диапазоны на первом уровне:

np.argwhere(
   ((start >= table_start) & (end <= table_end)).all(axis=-1)
)[:,1]

Теперь я не уверен, как эффективно повторить это для таблиц второго уровня. Я могу сделать что-то вроде np.take, чтобы извлечь совпадения для каждой из вложенных таблиц, а затем повторить поиск в этих таблицах, и так далее, и так далее ... однако затем я начинаю делать много python for переходит на go таблица за столом, и я также теряю первоначальный порядок пар начала / конца, поэтому мне придется отслеживать их сопоставление сбоку ... и все это кажется чтобы стать более сложным, чем должно быть.

Такое ощущение, что должен быть какой-то "numpy способ" отображения результатов от одного поиска к тому, где должен произойти следующий поиск ... но я не имею я не смог его найти.

Вот игрушечный пример:

  import numpy as np

  start = np.array([[0, 0], [2, 2], [4, 2]])
  end = np.array([[1, 1], [3, 3], [4, 3]])
  start = np.expand_dims(start, axis=-2)
  end = np.expand_dims(end, axis=-2)

  top_table_start = np.array([[0, 0], [0, 2], [0, 4]])
  top_table_end = np.array([[4, 2], [4, 4], [4, 6]])

  indices = np.argwhere(
      ((start >= top_table_start) & (end <= top_table_end)).all(axis=-1)
  )[:, 1]
  print(indices)
  # [0, 1, 1]
  # first range is in table 0, the next two are in table 1

  subtable_start = [[] for _ in range(2)]
  subtable_end = [[] for _ in range(2)]
  subtable_start[0] = np.array([[0, 0], [2, 0]])
  subtable_end[0] = np.array([[2, 0], [4, 0]])
  subtable_start[1] = np.array([[0, 2], [2, 2]])
  subtable_end[1] = np.array([[2, 2], [4, 2]])

  # Now need to lookup first start/end pair in subtable0, and the other two in subtable1...?!
  # ...

Я рассмотрел уплощение структуры так, чтобы все диапазоны листьев были в одной таблице ... однако, тогда мы Вы смотрите на гигантский c поиск в таблице, и он не будет быстрее ручного иерархического обхода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...