将数据集拆分为30块时报array split无法均分错误的解决方案求助
报错原因与解决方案
核心原理
numpy的split()函数强制要求拆分后所有子数组的长度完全相等,只要原数组总长度无法被指定的拆分数目整除,就会抛出array split does not result in an equal division错误,没有自动兼容的逻辑。
问题定位
结合你给出的数据集长度和拆分逻辑计算:
- 原始数据集总长度为2317
- 训练集
train = data[1:-72]的长度为 2317 - 1(舍弃首条) - 72(舍弃尾72条)= 2244,2244 ÷ 30 = 74.8,不是整数,无法均分 - 测试集
test = data[-72:-6]的长度为 72 - 6 = 66,66 ÷ 30 = 2.2,同样不是整数,无法均分
这就是你多次尝试仍触发报错的根本原因。
修复方案
根据你的业务需求选对应方案即可:
方案1:允许个别子数组长度有差异,不丢数据
直接将split()替换为numpy提供的容错拆分函数array_split(),该函数会自动将无法均分的多余条目平摊到前几个子数组中,不会报错:
from numpy import array, array_split # split a univariate dataset into train/test sets def split_dataset(data): # split into standard weeks print(len(data)) # len is 2317 train, test = data[1:-72], data[-72:-6] #328 for weekly # restructure into windows of weekly data print(train.shape) train = array(array_split(train, len(train)//30))#7 for weekly test = array(array_split(test, len(test)//30)) #print(train.shape) return train, test
方案2:要求所有子数组严格为30条,允许丢弃少量冗余数据
先对训练集、测试集做截断,取能被30整除的最大长度后再拆分:
from numpy import array, split def split_dataset(data): print(len(data)) # len is 2317 train, test = data[1:-72], data[-72:-6] #328 for weekly # 截断到可被30整除的长度 train = train[: len(train) // 30 * 30] test = test[: len(test) // 30 * 30] train = array(split(train, len(train)//30))#7 for weekly test = array(split(test, len(test)//30)) return train, test
方案3:时间序列预测场景专用(构造滑动窗口样本)
如果你是要构造「输入前30天数据,预测后续目标」的时间序列样本,不要用一次性拆分的逻辑,改用滑动窗口生成即可,示例逻辑如下:
def create_sliding_windows(data, window_size=30): X = [] for i in range(len(data) - window_size): X.append(data[i:i+window_size]) return array(X)
内容的提问来源于stack exchange,提问作者Zarkaylia
相关产品推荐
相关产品推荐

