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

Python中*args解包后,如何重新打包train_test_split的返回结果?

重新打包train_test_split拆分后的多输入结果

当你用*x把列表里的多个输入传入train_test_split后,返回的结果是按「每个输入的训练集→测试集」的顺序排列的,最后才是目标变量y的训练集和测试集。要重新打包成和原x结构对应的训练/测试集合,可以按以下步骤操作:


核心思路

假设原列表x有n个元素(比如矩阵、标量、其他自定义数据),那么train_test_split(*x, y)返回的结果结构是:
[x0_train, x0_test, x1_train, x1_test, ..., xn-1_train, xn-1_test, y_train, y_test]

我们需要把这些结果拆分成三部分:

  • 所有x分量的训练集(和原x结构完全对应)
  • 所有x分量的测试集(和原x结构完全对应)
  • y的训练集与测试集

代码实现

import numpy as np
from sklearn.model_selection import train_test_split

# 模拟你的输入结构
x = [np.random.rand(100, 5), np.random.rand(100), np.random.randint(0, 2, 100)]
y = np.random.randint(0, 2, 100)

# 执行拆分
split_results = train_test_split(*x, y, test_size=0.2, random_state=42, shuffle=True)

# 计算原x的元素个数
n = len(x)

# 分离x相关的拆分结果和y相关的拆分结果
x_split_parts = split_results[:2*n]
y_split_parts = split_results[2*n:]

# 重新打包训练集和测试集的x部分
train_x = x_split_parts[::2]  # 取索引0、2、4...的元素,对应每个x分量的训练集
test_x = x_split_parts[1::2]  # 取索引1、3、5...的元素,对应每个x分量的测试集

# 提取y的训练和测试集
y_train, y_test = y_split_parts

验证效果

你可以简单检查结构是否匹配:

print(f"原x的元素数量:{len(x)}")
print(f"train_x的元素数量:{len(train_x)}")
print(f"train_x[0]的形状:{train_x[0].shape}(对应原x[0]的训练集)")
print(f"train_x[1]的形状:{train_x[1].shape}(对应原x[1]的训练集)")

更简洁的写法

如果喜欢紧凑的代码,可以直接写成:

n = len(x)
train_x, test_x = split_results[0::2][:n], split_results[1::2][:n]
y_train, y_test = split_results[2*n:]

这样就能完美还原和原x结构对应的训练/测试集合啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:25:54