我有一个包含 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
