You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现K-means聚类散点图时X位置切片报错问题求解

K-means聚类绘图代码报错排查

报错原因

X[:,0]是numpy数组的按位置索引语法,而你代码里的X是pandas DataFrame对象,不支持这种二维位置切片写法,因此该行代码运行失败。
KMeans训练步骤没有报错是因为scikit-learn的模型接口兼容pandas DataFrame输入,训练时会自动将其转换为numpy数组处理,不需要手动做格式转换。
你替换成直接取df列的写法能正常运行,是因为传入的pandas Series对象是matplotlib原生支持的输入格式。

修复方案

二选一即可:

  • 方案1:使用pandas自带的位置索引器iloc适配DataFrame的索引规则,不需要修改X的定义
    # 把原来报错的那行替换成这行
    plt.scatter(X.iloc[:,0], X.iloc[:,1])
    
  • 方案2:将X转换为numpy数组后再用位置索引,两种写法都可以
    # 写法1:绘图时临时转numpy
    plt.scatter(X.to_numpy()[:,0], X.to_numpy()[:,1])
    
    # 写法2:定义X的时候直接转成numpy数组,后续所有操作都按numpy数组语法写
    X = df[['List Agency Code', 'Exam No']].copy().to_numpy()
    

优化建议

绘制样本散点时可以增加c=pred_y参数,自动给不同聚类簇的样本分配不同颜色,聚类效果更直观:

plt.scatter(X.iloc[:,0], X.iloc[:,1], c=pred_y, cmap='viridis')

修正后完整代码

X = df[['List Agency Code', 'Exam No']].copy()   

kmeans = KMeans(n_clusters=4, init='k-means++', max_iter=300, n_init=10, random_state=0)
pred_y = kmeans.fit_predict(X)
plt.scatter(X.iloc[:,0], X.iloc[:,1], c=pred_y, cmap='viridis')

plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='red')
plt.show()

内容的提问来源于stack exchange,提问作者Emy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 07:36:18