基于分组大小数组的update/reset函数调用序列生成需求
问题需求
背景定义
现有update()和reset()两个函数(称为"ID"),需按对应分组大小数组的定义,依次作用于data数组的连续行组。分组大小数组的定义示例如下:
import numpy as np # 长度为5的data数组 data = np.array([1., 4., 3., 8., 9.], dtype='float64') # update函数对应的分组大小数组 update_gs = np.array([1, 0, 2, 2], dtype='int64') # 分组大小总和为5,对应data的行数,含义为: # - 第1次update作用于第1行 # - 第2次update不作用于任何行 # - 第3次update作用于第2、3行 # - 第4次update作用于第4、5行 # reset函数对应的分组大小数组 reset_gs = np.array([2, 0, 0, 2, 1], dtype='int64') # 分组大小总和为5,对应data的行数,含义为: # - 第1次reset作用于前2行 # - 第2、3次reset不作用于任何行 # - 第4次reset作用于第3、4行 # - 第5次reset作用于最后一行
目标输出
需要生成两个一维数组:
group_sizes(int类型):记录每次函数调用距上一次调用的已处理行数;function_ids(bool类型):标记当前调用为reset(True)或update(False)。
调用序列排序规则
- 行组有重叠时,按行组最后一行的位置排序,最后一行越靠后,调用越晚;
- 若行组最后一行相同,
update调用优先在前。
示例预期输出
group_sizes = np.array([1, # 第1次操作是update,作用于data第1行 0, # 第2次update,无作用行 1, # 第1次reset,作用于data第2行 0, # 第2次reset,无作用行 0, # 第3次reset,无作用行 1, # 第3次update,距上次操作已处理1行 1, # 第4次reset,距上次操作已处理1行 1, # 第4次update,距上次操作已处理1行 0, # 最后一次reset,与前一次update的结束行相同 ], dtype='int64') # 数组元素总和为5,对应data的总行数 function_ids = np.array([False, # 第1次操作是update False, # 第2次操作是update True, # 第1次操作是reset True, # 第2次操作是reset True, # 第3次操作是reset False, # 第3次操作是update True, # 第4次操作是reset False, # 第4次操作是update True, # 最后一次操作是reset ], dtype='bool')
设计思路说明
函数的执行逻辑依赖于上一次调用的函数类型及结果,最初尝试嵌套循环实现,但代码复杂度极高且难以维护,因此期望通过生成上述数组实现扁平化循环。
性能要求
data数组规模达数百万行,而update_gs和reset_gs仅数千行,为保障性能,需优先基于分组数组循环而非逐行遍历data。
内容的提问来源于stack exchange,提问作者pierre_j
相关产品推荐
相关产品推荐

