sklearn加载linnerud构造DataFrame触发NumPy TypeError报错问题
报错原因
你触发TypeError: only integer scalar arrays can be converted to a scalar index的核心原因是对sklearn的Linnerud数据集结构理解有误:
linnerud.target是形状为(20,3)的二维数值数组,存储20个样本对应的3项生理指标(体重、腰围、脉搏)的具体数值,不是类别索引- 你在列表推导式中遍历
linnerud.target拿到的每个v都是长度为3的数值数组,无法作为下标去取linnerud.target_names的元素,因此触发类型错误
正确实现代码
如果你需要将运动特征和生理指标合并为完整的DataFrame,并且绘制带分类维度的pairplot,可以参考以下两种实现:
方案1:合并全部生理指标列,指定某一项生理指标为hue分类维度
import numpy as np import seaborn as sns; sns.set(style="ticks", color_codes=True) import sklearn.datasets import pandas as pd linnerud = sklearn.datasets.load_linnerud() # 横向拼接运动特征和生理指标 linnerud_df = pd.DataFrame( data= np.c_[linnerud.data, linnerud.target], columns= linnerud.feature_names + linnerud.target_names ) # 示例:以体重(Weight)作为分组维度绘制pairplot,可自行替换为Waist或Pulse g = sns.pairplot(linnerud_df, hue='Weight')
方案2:新增physiological分类列,按生理指标区间分组后绘制
如果你确实需要单独的physiological分类列,可以先对生理指标做离散化分组:
import numpy as np import seaborn as sns; sns.set(style="ticks", color_codes=True) import sklearn.datasets import pandas as pd linnerud = sklearn.datasets.load_linnerud() linnerud_df = pd.DataFrame( data= linnerud.data, columns= linnerud.feature_names ) # 示例:按腰围区间划分physiological类别,可根据需求调整分组规则 linnerud_df['physiological'] = pd.cut( linnerud.target[:,1], bins=[0, 31, 35, 100], labels=['偏瘦', '正常', '偏胖'] ) g = sns.pairplot(linnerud_df, hue='physiological')
内容的提问来源于stack exchange,提问作者meloqq
相关产品推荐
相关产品推荐

