Python中逐元素合并经纬度数组以实现K-means聚类求助
合并经纬度数组用于K-means聚类的正确姿势
你的核心思路没问题——把纬度和经度配对成坐标点数组,但原代码里初始化coordinates的方式踩了坑:np.array(385)只会创建一个值为385的单元素数组,根本装不下385个坐标对,直接赋值肯定会报错。
下面给你几种简洁高效的实现方式:
方法1:用np.column_stack直接合并(最推荐)
这个方法专门用来把一维数组按列合并成二维数组,完美适配你的需求:
import numpy as np from sklearn.cluster import KMeans import matplotlib.pyplot as plt # 假设data是你的数据集 long = np.array(data.Longitude) lat = np.array(data.Latitude) # 直接合并成N×2的坐标数组,每一行是[纬度, 经度] coordinates = np.column_stack((lat, long)) # 接下来运行K-means聚类(这里用sklearn的KMeans,也可以用你原来的kmeans2) kmeans = KMeans(n_clusters=3, max_iter=20, random_state=42) y = kmeans.fit_predict(coordinates) # 可视化结果(注意经度放x轴、纬度放y轴更符合地图习惯) plt.scatter(coordinates[:, 1], coordinates[:, 0], c=y) plt.xlabel('Longitude') plt.ylabel('Latitude') plt.show()
方法2:用列表推导式构建后转数组
如果你习惯更直观的循环逻辑,也可以这样写,既贴合你原本的思路,又避免手动初始化数组的错误:
coordinates = np.array([[lat[i], long[i]] for i in range(len(lat))])
方法3:用np.vstack转置合并
另一种灵活的合并方式,先把两个一维数组垂直堆叠,再转置成二维数组:
coordinates = np.vstack((lat, long)).T
小提示
- 如果你用的是
scipy.cluster.vq里的kmeans2,记得先通过whiten()对数据做白化处理;但sklearn的KMeans会自动处理数据缩放,不需要额外操作 - 可视化时把经度放在x轴、纬度放在y轴,展示的点会和实际地图位置对应,更直观
内容的提问来源于stack exchange,提问作者Pankaj
相关产品推荐
相关产品推荐

