Sklearn train_test_split处理二维向量时出现异常维度输出问题
问题解答:train_test_split拆分结果异常与numpy 0维度数组的疑问
嘿,这个问题我之前也碰到过类似的情况,来给你捋清楚~
1. 为什么train_test_split会得到(0,100)和(1,100)的结果?
这其实是sklearn的预期行为,核心原因在于train_test_split默认是按数组的第一个维度来划分样本的。
你的数组A形状是(1,100),在sklearn的逻辑里,这代表你只有1个样本(第一个维度是样本数量),每个样本有100个特征。而train_test_split默认的测试集比例是0.25,也就是说要拆分出25%的样本——但1个样本的25%是0.25个,这显然无法实现,所以它会把仅有的1个样本全部分配给测试集,训练集自然就没有样本了,也就是形状变成(0,100)。
如果你的需求是按特征维度拆分(比如把100个特征分成训练和测试用),那你需要先把数组转置,让特征维度变成第二个维度:
import sklearn.model_selection as skl_ms import numpy as np A = np.random.normal(0, 1, [1, 100]) # 转置数组,形状变为(100,1),此时第一个维度是100个"样本"(每个样本对应一个特征) A = A.T (A_train, A_test) = skl_ms.train_test_split(A) print(A_train.shape) # 输出大概是(75, 1) print(A_test.shape) # 输出大概是(25, 1)
2. 为什么numpy允许第一维度为0的数组存在?
这其实是numpy为了保持数据结构一致性设计的灵活特性,在很多场景下非常实用:
- 当处理空数据集时,0维度数组能维持原有的维度结构,避免后续代码因为维度突然变化而报错;
- 在数据筛选、算法输出等场景中,如果没有符合条件的元素,返回形状为
(0, n)的数组,能让后续的数组操作(比如拼接、统计计算)正常执行,不用额外加一堆空值判断逻辑。
举个简单例子:
arr = np.array([0.5, 0.3, -0.2]) # 筛选大于1的元素,结果是空数组,形状为(0,) filtered_arr = arr[arr > 1] print(filtered_arr.shape) # 输出(0,)
这种情况下,空数组依然能参与后续的数组运算,比如filtered_arr.mean()会返回nan,但不会直接抛出错误,让代码逻辑更健壮。
内容的提问来源于stack exchange,提问作者user49404
相关产品推荐
相关产品推荐

