Проблема с типом данных при использовании scipy.spatial

Я хочу использовать KDTree scipy.spatial, чтобы найти пары ближайших соседей в двумерном массиве (по сути, это список списков, размер вложенного списка которых равен 2). Я генерирую свой список списков, отправляю его в массив numpy и затем создаю экземпляр KDTree. Однако всякий раз, когда я пытаюсь выполнить запрос, я неизбежно получаю странные ответы. Например, когда я печатаю:

tree = KDTree(array)
nearest = tree.query(np.array[1,1])

ближайшие распечатки (0,0, 0). В настоящее время я использую массив, который в основном у = х для диапазона (1,50), поэтому я ожидаю, что я должен получить ближайший сосед (2,2) для (1,1)

Что я делаю не так, скучные гуру?

РЕДАКТИРОВАТЬ: В качестве альтернативы, если кто-то может указать мне пакет KDTree для Python, который они использовали для поиска ближайшего соседа в данной точке, я хотел бы услышать об этом.

Ответы на вопрос(1)

Решение Вопроса

я использовалscipy.spatial раньше, и это кажется хорошим улучшением (особенно в отношении интерфейса) по сравнению сscikits.ann.

В этом случае я думаю, что вы перепутали возврат от вашегоtree.query(...) вызов. Отscipy.spatial.KDTree.query документы:

Returns
-------

d : array of floats
    The distances to the nearest neighbors.
    If x has shape tuple+(self.m,), then d has shape tuple if
    k is one, or tuple+(k,) if k is larger than one.  Missing
    neighbors are indicated with infinite distances.  If k is None,
    then d is an object array of shape tuple, containing lists
    of distances. In either case the hits are sorted by distance
    (nearest first).
i : array of integers
    The locations of the neighbors in self.data. i is the same
    shape as d.

Так что в этом случае, когда вы запрашиваете ближайший к[1,1] вы получаете:

distance to nearest: 0.0
index of nearest in original array: 0

Это означает, что[1,1] первая строка ваших исходных данных вarray, что ожидается, учитывая ваши данныеy = x on the range [1,50].

scipy.spatial.KDTree.query Функция имеет много других опций, поэтому, если вы, например, хотите убедиться, что ближайший сосед, который сам не является, попробуйте:

tree.query([1,1], k=2)

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

 jlv06 окт. 2010 г., 21:39
Спасибо Теперь имеет больше смысла!

Ваш ответ на вопрос