2016-02-16 8 views
0

У меня есть фрейм данных pandas, содержащий список координат x, y, и я использую scipy.spatial, чтобы найти ближайшую точку в dataframe с учетом дополнительной точки.Различия scipy.spatial.KDTree в python 2.7 и 3.5

import pandas as pd 
import numpy as np 
import scipy.spatial as spatial 

stops = pd.read_csv("stops.csv") 
pt = x,y 
points = np.array(zip(stops['stop_lat'],stops['stop_lon'])) 
nn = points[spatial.KDTree(points).query(pt)[1]] 

Теперь, в python 2.7 это работает отлично. В python 3.5 возникает следующая ошибка:

.../scipy/spatial/kdtree.py", line 231, in __init__ 
self.n, self.m = np.shape(self.data) 
ValueError: not enough values to unpack (expected 2, got 0) 

В документах я не могу найти ничего полезного.

+2

Что делает ' точки выглядят? В Python3 'zip()' возвращает объект '' zip' iterator '' (https://docs.python.org/3/library/functions.html#zip), а не список кортежей, поэтому 'points' является вероятно, массив 0-d объектов, содержащий итератор 'zip' во втором случае. –

+0

Да, это была проблема. Я сделал список (zip (...)), и теперь он работает отлично. благодаря – Angelo

ответ

4

В Python3, zip() возвращает iterator object, а не список кортежей. Поэтому points будет 0-мерным массивом np.object, содержащим итератор zip, а не двумерный массив координат x, y.

Вы можете построить list из итератора:

points = np.array(list(zip(stops['stop_lat'],stops['stop_lon']))) 

Однако более элегантное решение могло бы быть, чтобы избежать использования zip в целом путем индексации нескольких столбцов вашего dataframe:

points = stops[['stop_lat','stop_lon']].values 
Смежные вопросы