给定numpy字符串数组,如何基于指定切片条件高效提取对应索引
气象数据月份首尾索引提取优化方案
原代码核心问题
- 存在12段重复的if判断逻辑,代码冗余容易出错
- 定义12个独立列表存储全量索引,浪费内存,你实际仅需要首尾索引无需存储所有值
- 纯Python遍历效率在数据量大时偏低
方案1:仅用基础Python语法(适合新手,无额外学习成本)
核心思路:用字典统一存储12个月的首尾索引,无需定义12个独立变量,遍历一次即可直接记录首尾值,不需要存储全量索引。
# 初始化字典:key为月份字符串,value为[起始索引, 结束索引],初始None标记未匹配到数据 month_range = {f"{i:02d}": [None, None] for i in range(1, 13)} for idx in range(len(DATE_np)): current_mon = DATE_np[idx][4:6] # 第一次匹配到对应月份时,记录起始索引 if month_range[current_mon][0] is None: month_range[current_mon][0] = idx # 每次匹配都更新结束索引,最后一次更新的就是当月最后一条数据的索引 month_range[current_mon][1] = idx
使用方法:例如获取1月的首尾索引,直接调用month_range['01'][0](首索引)、month_range['01'][1](尾索引)即可。
方案2:利用NumPy特性(适合大数据量,效率更高)
你的日期本身是NumPy数组,可以用向量化操作替代纯Python循环,数据量越大性能优势越明显。
import numpy as np # 提取所有日期对应的月份,生成等长的月份数组 # 若DATE_np为字符串类型NumPy数组,可直接用更高效的切片操作:months = DATE_np.astype('U6').view('U2')[:, 2] months = np.array([d[4:6] for d in DATE_np]) month_range = {} for mon in [f"{i:02d}" for i in range(1, 13)]: # 生成匹配当前月份的布尔掩码 mon_mask = months == mon if mon_mask.any(): # 数据按时间排序的前提下,第一个True位置就是首索引,最后一个True就是尾索引 start_idx = np.argmax(mon_mask) end_idx = len(mon_mask) - 1 - np.argmax(mon_mask[::-1]) month_range[mon] = [start_idx, end_idx] else: # 当月无数据时标记为None,避免报错 month_range[mon] = [None, None]
内容的提问来源于stack exchange,提问作者Michael Saban
相关产品推荐
相关产品推荐

