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

将数据集拆分为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 19:57:03