Skip to main content
 首页 » 编程设计

python之python 2.7 和 3.5 中 scipy.spatial.KDTree 的区别

2025年05月04日27JeffreyZhao

我有一个包含 x、y 坐标列表的 Pandas 数据框,我正在使用 scipy.spatial 在给定附加点的情况下找到数据框中最近的点。

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) 

在文档中我找不到任何有用的东西。

请您参考如下方法:

在 Python3 中,zip() 返回 iterator object而不是元组列表。因此,points 将是一个包含 zip 迭代器的 0 维 np.object 数组,而不是 x、y 坐标的二维数组。

您可以从迭代器构造一个列表:

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

但是,更优雅的解决方案可能是通过索引数据帧的多个列来避免完全使用 zip:

points = stops[['stop_lat','stop_lon']].values