如何高效将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
相关产品推荐
相关产品推荐

