在Python中合并大小不同的两个列表列表

0 投票
2 回答
784 浏览
提问于 2025-04-17 21:25

我正在尝试写一个代码来进行10折交叉验证。

简单来说,就是把数据分成10个大小相等的部分。然后,在每次的10次循环中,拿出第i个部分,剩下的90%用作测试数据。

在第二次循环中,我需要把前10%的数据和最后80%的数据合在一起。第三次循环时,我把前20%的数据和最后70%的数据合在一起,依此类推。

(所以在第一次循环中,前10%的数据被去掉;在第二次循环中,第二个10%的数据被去掉,等等。)

我的数据总共有1000个项目,每个项目是一个包含70个np.float类型值的数组。

这个循环会在每次10次验证中被调用,i的值从0到9:

def get_training(input_array, i):
    training = (input_array[:i*subset_size] + input_array[(i+1)*subset_size:])
    return training

之前这个代码是可以正常工作的,但现在我遇到了一个错误:

operands could not be broadcast together with shapes (100,70) (800,70)

我觉得这可能是因为np.float数据类型的问题;之前用其他数据类型时是可以正常工作的。

谢谢!

2 个回答

1

试试这个:

training = np.concatenate((input_array[:i*subset_size], input_array[(i+1)*subset_size:]))

(对于numpy数组来说,+这个符号是用来把数值加在一起的,前提是它们的形状得一样:)

a = np.array(range(10))
print a + a                 # => [ 0  2  4  6  8 10 12 14 16 18]
2

别自己重复造轮子。你可以使用KFoldStratifiedKFold这两个函数,它们在sklearn.cross_validation模块里。

可以看看文档:

K-Folds交叉验证迭代器。

它提供了训练和测试的索引,用来把数据分成训练集和测试集。这个方法会把数据集分成k个连续的部分(不打乱顺序)。

每一部分会被用作一次验证集,而剩下的k-1部分则组成训练集。

撰写回答