Проблема с типом данных при использовании scipy.spatial - PullRequest
6 голосов
/ 06 октября 2010

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

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

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

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

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

1 Ответ

9 голосов
/ 06 октября 2010

Я использовал 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

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

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

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

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

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