如何高效将索引分割列表扩展为索引数组?寻求内置函数替代循环实现
如何高效将索引分割列表扩展为索引数组?寻求内置函数替代循环实现
嘿,这个需求我做数据处理的时候也碰到过!你的现有实现其实已经挺简洁了,但确实有更贴合「内置函数」思路的numpy方案,不用写显式的循环(虽然列表推导在numpy场景下也不算差,但用更针对性的原生函数会更优雅,性能也更优)。
推荐你用np.repeat配合np.diff来实现,完全不需要手动写for循环:
import numpy as np def expand_split_list(split_list): # 先算出每个索引需要重复的次数(各区间的长度) interval_lengths = np.diff(split_list) # 生成对应索引序列,按次数重复每个索引 return np.repeat(np.arange(len(interval_lengths)), interval_lengths)
原理说明:
np.diff(split_list)会直接计算分割列表中相邻元素的差值,也就是每个索引i需要填充的次数(比如输入[0,2,5,7]会得到[2,3,2]);np.arange(len(interval_lengths))生成我们需要填充的索引序列(对应例子里的[0,1,2]);np.repeat会按照interval_lengths里的次数,依次重复每个索引,直接生成目标数组。
测试一下你的示例输入:
print(expand_split_list([0,2,5,7])) # 输出:array([0, 0, 1, 1, 1, 2, 2])
结果和你原来的实现完全一致,但这个方法是纯numpy原生操作,减少了中间数组的创建和拼接开销,当处理大规模数据时,性能会比原方法更出色。
另外要提一句:这个方法要求你的分割列表是严格递增的(题目里的输入显然符合这个要求,因为是索引分割),如果有非递增的情况需要额外处理,但你的场景里应该不需要担心这个问题。
备注:内容来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

