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

如何按网格方式拆分shape为(1000,400,56)的NumPy数组?

解决NumPy数组网格拆分问题

你需要将每个(400,56)的样本按时间轴拆分为2段(各200)、特征轴拆分为2段(各28),得到4个交叉组合的(200,28)子样本,最终整体shape为(1000,4,200,28)。直接reshape会破坏交叉组合的逻辑,最优方案是通过维度重组+轴交换实现,全程为向量化操作,效率最高。

核心实现代码

import numpy as np

# 构造测试数组(模拟你的输入)
arr = np.random.rand(1000, 400, 56)

# 步骤1:拆分时间和特征维度为网格结构
# 将(1000,400,56) reshape为(1000, 2, 200, 2, 28)
# 其中:2是时间拆分份数,2是特征拆分份数
arr_reshaped = arr.reshape(1000, 2, 200, 2, 28)

# 步骤2:交换轴并合并拆分维度
# transpose调整轴顺序:样本数 → 时间拆分轴 → 特征拆分轴 → 时间长度 → 特征长度
# 再reshape合并时间和特征拆分轴,得到4个子样本
arr_split = arr_reshaped.transpose(0, 1, 3, 2, 4).reshape(1000, 4, 200, 28)

# 验证结果shape
print(arr_split.shape)  # 输出 (1000,4,200,28)

原理说明

  1. 维度拆分:第一步reshape将原数组的时间维度400拆分为2×200,特征维度56拆分为2×28,得到中间结构(1000, 时间拆分份数, 单段时间长度, 特征拆分份数, 单段特征长度),明确区分开两个拆分维度。
  2. 交叉重组:第二步transpose将「时间拆分轴」和「特征拆分轴」调整为相邻位置,再通过reshape合并这两个轴为2×2=4,最终得到4个符合需求的交叉子样本:
    • 时间前200 + 特征前28
    • 时间前200 + 特征后28
    • 时间后200 + 特征前28
    • 时间后200 + 特征后28

备选直观方案(效率略低)

如果偏好更直白的拆分逻辑,也可以用np.split实现,但会产生多次数组复制,效率不如上面的方法:

# 拆分时间轴为2段
time_parts = np.split(arr, 2, axis=1)  # 得到两个(1000,200,56)的数组

# 对每个时间段拆分特征轴
part1_feats = np.split(time_parts[0], 2, axis=2)  # [(1000,200,28), (1000,200,28)]
part2_feats = np.split(time_parts[1], 2, axis=2)  # [(1000,200,28), (1000,200,28)]

# 堆叠4个子样本
arr_split = np.stack([part1_feats[0], part1_feats[1], part2_feats[0], part2_feats[1]], axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:05:38