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

如何高效将NumPy数组按两种指定方式分块?

NumPy数组分块解决方案

需求回顾

对长度为30的NumPy数组x实现两种分块逻辑:

  • 无重叠划分:生成3个长度为8的子数组 + 1个长度为6的子数组
  • 带重叠的末尾块:最后一块由前一块的最后2个样本加剩余6个样本组成(即最后一块长度为8,与前一块重叠2个元素)

方法一:无重叠指定长度分块

np.array_split会自动将剩余元素均匀分配到多个块中,这是导致你得到2个8长度、2个7长度数组的原因。要实现精准的块长度控制,直接手动定义分割点,使用np.split即可:

import numpy as np

x = np.array([1,1,2,1,1,2,1,0,3,1,2,2,1,2,1,1,50,1,1,1,1,4,1,11,15,0,0,1,1,0])
# 分割点设为8、16、24,对应前3块的结束索引
split_indices = [8, 16, 24]
result1 = np.split(x, split_indices)

输出结果:

[array([1, 1, 2, 1, 1, 2, 1, 0]),
 array([3, 1, 2, 2, 1, 2, 1, 1]),
 array([50,  1,  1,  1,  1,  4,  1, 11]),
 array([15,  0,  0,  1,  1,  0])]

完全符合3个8长度、1个6长度的需求。np.split基于索引直接分割原数组(无额外复制),效率极高,适合处理超大数组。


方法二:末尾块与前块重叠2个元素的分块

要实现最后一块包含前一块的最后2个元素+剩余6个元素,只需让最后一块从len(x)-8的索引开始(30-8=22,从22到末尾共8个元素)。我们可以先提取前3个无重叠块,再追加最后一块:

# 先获取前3个无重叠块
result2 = list(np.split(x, split_indices))[:3]
# 添加最后一块:从索引22到末尾(共8个元素)
result2.append(x[-8:])

输出结果:

[array([1, 1, 2, 1, 1, 2, 1, 0]),
 array([3, 1, 2, 2, 1, 2, 1, 1]),
 array([50,  1,  1,  1,  1,  4,  1, 11]),
 array([ 1, 11, 15,  0,  0,  1,  1,  0])]

最后一块包含了第三块的最后2个元素(1、11)和后续6个元素,满足需求。这种方式全部使用NumPy原生切片操作,无冗余计算,处理大数组时性能拉满。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:15:16