如何对二维numpy数组进行周期性切片提取指定元素
Numpy 按周期规则采样300×300数组至75×75实现方案
核心逻辑说明
你的采样规则对应单轴周期长度为5+15=20,每个周期内保留前5个元素。300长度的轴一共包含300/20=15个完整周期,最终单轴输出长度为15*5=75,符合预期尺寸要求,两个轴逻辑完全一致。
实现方法
方法1:布尔掩码索引(写法直观易理解)
先生成符合采样规则的单轴布尔掩码,再对两个维度同时切片:
import numpy as np # 示例输入数组 arr = np.random.rand(300, 300) # 生成单轴采样掩码:每20个元素取前5个 single_axis_mask = np.tile([True]*5 + [False]*15, 300 // 20) # 双轴同时切片得到结果 result = arr[single_axis_mask[:, None], single_axis_mask] # 验证输出尺寸 print(result.shape) # 输出 (75, 75)
方法2:Reshape 维度拆分(大数组下效率更高)
通过维度拆分直接按周期筛选元素,不需要生成额外掩码数组,内存占用更低:
import numpy as np # 示例输入数组 arr = np.random.rand(300, 300) # 维度拆分后按周期取前5个元素,再合并维度得到结果 result = arr.reshape(15, 20, 15, 20)[:, :5, :, :5].transpose(0, 2, 1, 3).reshape(75, 75) # 验证输出尺寸 print(result.shape) # 输出 (75, 75)
reshape方案逻辑说明:
- 首先将原数组的两个300长度轴分别拆分为
15个周期 × 每个周期20个元素,得到四维数组形状为(15, 20, 15, 20)- 分别筛选每个行、列周期的前5个元素,得到形状为
(15, 5, 15, 5)的中间数组- 调整维度顺序后合并行、列维度,最终得到75×75的输出数组
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

