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

Sklearn鸢尾花分类代码报错:期望2D数组却得到1D数组

解决Sklearn鸢尾花分类中的ValueError:Expected 2D array, got 1D array instead

嘿,这个问题我帮不少刚入门机器学习的朋友踩过坑,咱们一步步拆解清楚:

错误原因

你遇到的这个报错,核心是Sklearn的模型训练方法fit()对输入数据的维度有严格要求:

  • 特征数据(也就是train_data)必须是二维数组,形状得是(样本数量, 特征数量)——简单说就是每一行代表一个样本,每一列代表这个样本的一个特征。
  • 但你的代码里,train_data = np.delete(iris.data, test_index)这一行出了问题:np.delete默认会把输入的多维数组先扁平化(拉成一维),再删除指定索引的元素。原本iris.data是(150,4)的二维数组(150个样本,每个样本4个特征),经过这个操作后,train_data变成了一维数组,形状是(588,)(1504 - 34 = 588),完全不符合Sklearn的要求,所以才会抛出这个维度不匹配的错误。

为什么会涉及数组重塑(reshape)?

很多新手会想到用reshape把一维数组转回去,但其实这是治标不治本的——因为扁平化后删除元素再重塑,会打乱样本的特征结构(原本的4个特征会被拆得乱七八糟)。真正的问题是你没告诉np.delete要按行删除样本,而不是乱删元素。

正确的解决办法

只需要给np.delete加上axis=0参数,指定按行(也就是样本维度)删除:

from sklearn.datasets import load_iris
from sklearn import tree
import numpy as np
# load data
iris= load_iris()
# position of the start of the flower names or indexes
test_index=[0,50,100]
# Training data
train_target = np.delete(iris.target,test_index)
# 加上axis=0,按行删除样本,保持二维结构
train_data=np.delete(iris.data,test_index, axis=0)
test_target=iris.target[test_index]
test_data=iris.data[test_index]
clf = tree.DecisionTreeClassifier()
clf=clf.fit(train_data , train_target)
print(test_target)

修改后,train_data的形状会是(147,4),完全符合Sklearn的输入要求,代码就能正常运行了。

你可以自己加一行print(train_data.shape)验证一下,看看是不是二维数组~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:43:57