У меня есть очень большая 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 поиск в таблице, и он не будет быстрее ручного иерархического обхода.